您的位置:首页 > 移动开发 > Android开发

在android studio中使用greenDao

2016-03-02 17:15 459 查看
最近项目重构,我负责android客户端数据库操作的封装,调研时发现了一款超级好用的ORM数据库框架——greenDao!

看了greenDao官网的说明,发现这个框架比之前用的ORMLite快很多,采用自动生成代码的方式也让人眼前一亮,于是决定试一试。

好了,话不多说,上代码!

一、配置工程

1、在../app/src/main 目录下新建Directory命名为java-gen-db,用于存放greenDao自动生成的代码.



2、为工程添加一个java的module,命名为daogenerator,此工程只有一个类MyDaoGenerator.





3、在app的build.gradle中添加以下代码

sourceSets{
main{
java.srcDirs = ['src/main/java','src/main/java-gen-db']
}
}


compile 'de.greenrobot:greendao:2.1.0'


在daogenerator的build.gradle中添加以下代码

compile 'de.greenrobot:greendao-generator:2.1.0'


配置好gradle后,同步(sync )一下.

同步结束后开始下一步.

二、生成代码

daogenerator的作用是生成geenDao操作数据库的DaoMaster、DaoSession,GreenDao和JavaBean。

引用古沐风的一段文字说明一下这些自动生成的代码什么意思:

(古沐风博客:/article/3572426.html

DaoMaster:一看名字就知道它是Dao中的最大的官了。它保存了sqlitedatebase对象以及操作DAO classes(注意:不是对象)。其提供了一些创建和删除table的静态方法,其内部类OpenHelper和DevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。

DaoSession:会话层。操作具体的DAO对象(注意:是对象),比如各种getter方法。

XXXDao:实际生成的某某DAO类,通常对应具体的java类,比如NoteDao等。其有更多的权限和方法来操作数据库元素。

XXXEntity:持久的实体对象。通常代表了一个数据库row的标准java properties。

现在我需要一个userInfo的表,我需要在MyDaoGenerator做以下的工作.

/**
* 此java工程用于生成
* greenDao操作数据库需要的
* DaoMaster  && DaoSession && xxDao && xxEntity
*/
public class MyDaoGenerator {

public static void main(String[] args) throws Exception{

//参数1:数据库版本
//参数2:自动生成代码默认包
Schema schema = new Schema(2,"org.xxx.db");

addUserInfo(schema);

//获取自动输出代码路径
//避免团队合作时各人项目路径不同
String url = MyDaoGenerator.class.getResource("/").getFile().toString();
String[] str = url.split("daogenerator");
String outDir = str[0] + "app/src/main/java-gen-db";
System.out.println(outDir);
new DaoGenerator().generateAll(schema,outDir);
}

/**
* 用户信息表
* @param schema
*/
private static void addUserInfo(Schema schema){
Entity userInfo = schema.addEntity("UserInfo");
userInfo.addStringProperty("userAddress");
userInfo.addStringProperty("userBirthday");
userInfo.addStringProperty("userCapacity");
userInfo.addStringProperty("userClass");
userInfo.addStringProperty("userCollege");
userInfo.addStringProperty("userEducation");
userInfo.addStringProperty("userHeadLink");
userInfo.addStringProperty("userHometown");
userInfo.addStringProperty("userIdcard");
userInfo.addStringProperty("userMark");
userInfo.addStringProperty("userName");
userInfo.addStringProperty("userNickname");
userInfo.addStringProperty("userPassword");
userInfo.addStringProperty("userQQNumber");
userInfo.addStringProperty("userRegistTime");
userInfo.addStringProperty("userSign");
userInfo.addStringProperty("userSpecialty");
userInfo.addStringProperty("userStuId");
userInfo.addStringProperty("userTel");
userInfo.addIntProperty("userInfoVersion");
userInfo.addIntProperty("userSex");
userInfo.addIntProperty("userType");
}
}


运行MyDaoGenerator,如果出现以下结果,就表示你配置成功,马上就可以任性的用greenDao操作数据库了.



再看一眼java-gen-db下自动生成的代码



三、android工程中初始化数据库

新建一个类DBLoader用于DaoSession的获取

public class DBLoader {
private static DaoMaster daoMaster = null;
private static DaoSession daoSession = null;
private static SQLiteDatabase db = null;

public static void init(){
MyDevOpenHelper helper = new MyDevOpenHelper(BaseApplication.getInstance(),Constants.DB_NAME,null);
db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
}

public static DaoSession getDaoSession(){
if (daoSession==null){
init();
}
return daoSession;
}
}


在Application中init后我们就能在工程里任意获取DaoSession,然后对数据库操作了。

public class BaseApplication extends android.app.Application {

private static Context context;

@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
DBLoader.init();
}

public static Context getInstance() {
return context;
}
}


四、封装数据库操作

最后为了让greenDao在项目中更方便的使用,我们还要做一些工作。

1.要注意在数据库升级的时候,greenDao会删除所有旧数据.因此这里得自己重写DaoMaster.OpenHelper的onUpgrade方法处理一下.

MyDevOpenHelper继承DaoMaster.OpenHelper,重写onUpgrade方法。

public class MyDevOpenHelper extends DaoMaster.OpenHelper {

public MyDevOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory){
super(context,name,factory);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion){
case 1:
//TODO
//数据库升级时在此处理
//否则升级后数据库会清空

//创建新表
//UserInfoDao.createTable(db,true);

//加入新字段
//db.execSQL("ALTER TABLE USER_INFO ADD RONG_TOKEN VARCHAR(50)");
break;
default:
break;
}
}
}


2.每个表要用一个DaoHelper来操作。比如我要操作UserInfo表,就得有个UserInfoDaoHelper类.

常用的数据库操作可以定义成接口DaoHelperInterface

public interface DaoHelperInterface {
public <T> void addData(T t);
public <T> void deleteData(T t);
public void deleteAll();
public <T> T getDataById(String id);
public List getAllData();
public boolean hasKey(String id);
public long getTotalCount();
}


UserInfoDaoHelper实现了DaoHelperInterface中的方法

public class UserInfoDaoHelper implements DaoHelperInterface{
private static UserInfoDaoHelper instance;
private UserInfoDao userInfoDao;

private UserInfoDaoHelper(){
try {
userInfoDao = ISwustDBLoader.getDaoSession().getUserInfoDao();
}catch (Exception e){
e.printStackTrace();
}
}

public static UserInfoDaoHelper getInstance(){
if (instance == null){
instance = new UserInfoDaoHelper();
}
return instance;
}

@Override
public <T> void addData(T bean) {
if(userInfoDao !=null && bean != null){
userInfoDao.insertOrReplace((UserInfo)bean);
}
}

@Override
public <T> void deleteData(T t) {

}

@Override
public void deleteAll() {
if (userInfoDao != null){
userInfoDao.deleteAll();
}
}

@Override
public <T> T getDataById(String id) {
return null;
}

@Override
public List getAllData() {
if (userInfoDao != null){
return userInfoDao.loadAll();
}
return null;
}

@Override
public boolean hasKey(String id) {
return false;
}

@Override
public long getTotalCount() {
if (userInfoDao != null){
QueryBuilder<UserInfo> qb = userInfoDao.queryBuilder();
return qb.buildCount().count();
}
return 0;
}
}


五、效果图

亲测有效不包邮哟!



第一篇博客,有错麻烦指正,不喜亲喷.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: