在android studio中使用greenDao

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

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

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

一、配置工程

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

在android studio中使用greenDao_第1张图片

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

在android studio中使用greenDao_第2张图片

在android studio中使用greenDao_第3张图片

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。

引用古沐风的一段文字说明一下这些自动生成的代码什么意思:
(古沐风博客:http://my.oschina.net/cheneywangc/blog/196354)

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 studio中使用greenDao_第4张图片

三、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  void addData(T t);
    public  void deleteData(T t);
    public void deleteAll();
    public  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  void addData(T bean) {
        if(userInfoDao !=null && bean != null){
            userInfoDao.insertOrReplace((UserInfo)bean);
        }
    }

    @Override
    public  void deleteData(T t) {

    }

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

    @Override
    public  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 qb = userInfoDao.queryBuilder();
            return qb.buildCount().count();
        }
        return 0;
    }
}

五、效果图

亲测有效不包邮哟!
在android studio中使用greenDao_第5张图片

第一篇博客,有错麻烦指正,不喜亲喷.

你可能感兴趣的:(android开发)