GreenDAO 使用简介

GreenDAO使用手册:


ORM 对象关系映射


一、优点

1、简单,使用起来方便,维护起来也不麻烦,但是会有些限制

2、不像ORM Lite那样使用注解,因此有了相比他更好的性能

3、内存占用少

4、library小

相对于其他的ORM类型的库来说,有更好的性能

http://greenrobot.org/greendao/features/

这是官方给出的性能比较

二、缺点

1、bean 对象的字段都必须是对象,比如一个int值需要变成integer,long会是Long,我们都知道最好用简单类型,所有他这样做,就会影响部分性能。

2、只用PRIMARY KEY 并且必须是Long型的才可以使用AUTOINCREMENT字段

3、如果有_id字段,那么就不能使用其他字段作为PRIMARY KEY

4、不能两个个表对应同一个bean。我之前有绕过这层检测,做到了一个bean对应两个表。但是如果使用过程中,需要对两个表同时修改,数据库存储没有出现问题,但是当再次从数据库获取表信息就回出现混乱。建议大家还是一个表对应一个bean

5、想起来再加

三、发现的问题及解决方案:

1、关于使用(gradle版)

    1】在主工程的build.gradle中(一般是app文件夹)的dependencies{}中加入

         compile 'de.greenrobot:greendao:2.1.0'

    2】然后右键app文件加,新建 module,在弹出的窗口中,选择Java Library,(这个文件用来生成GreenDAO使用的            bean和相关类)下一步,数据library Name,finish

    3】在新建library的build.gradle中的dependencies{}中加入 

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

    4】在library中,新建java类,Main函数中,创建你需要的bean对象信息

        如 我要建一个person:

        DaoGenerator gen = new DaoGenerator();
        Schema schema = new Schema(4, "packageName"); // packageName是你生成的对象所在的包路径
        Entity person = schema.addEntity("Person"); // Person对应生成类名
        person.addIdProperty().autoincrement(); // 添加ID
        person.addStringProperty("name").columnName("n"); //Name对象bean对象的字段,columnname对象数据库中的字段,也可以不指定
        person.addIntProperty("age").columnName("age");
        // 下面这个句很关键,没有的话,不会生成相关类的哦!
        gen.generateAll(schema, "./app/src/main/java-gen"); // 后面参数,用于指定生成的数据在APP的哪个文件夹里,跟包名没有关系。

     然后运行Main函数。在Message中会看到生成成功的提示

5】不要忘记在app中build.gradle中添加生成数据的加载信息:

  在android{} 里面添加节点:

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

6】在使用的时候初始化

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "person", null);
SQLiteDatabase db = helper.getWritableDatabase();
daoMaster = new DaoMaster(mDB);
daoSession = daoMaster.newSession();
personDao = daoSession.getPersonDao();

插入操作:

Person p = new Person();
p.setName = "jhon"
p.setAge = 12;
personDao.insert(p);

其他更多操作,请见官方文档

http://greenrobot.org/greendao/documentation/how-to-get-started/

API:

http://greenrobot.org/files/greendao/javadoc/2.1/

http://greenrobot.org/files/greendao/javadoc/2.1/


2、关于不能一个对象对应多个表

没有解决办法,即使生成成功,除非保证两个表不同时操作,否则会出现非常奇怪的问题,比如找不到另外一个表的数据,过一会有又了,但是顺序是错误的。

3、关于预置数据库

    GreenDAO没有提供有预置数据库的文档,我的解决方案如下:

    1】先按照上面4】的步骤生成对应的bean对象和相关类,Schema不要使用同一个,后面传入的包名,最好不一样(本人没有测试一样的情况)。

    2】将与生成bean字段一致的表,数据库放到assets目录下

    3】在自己的Application里(必须在使用预置数据库之前)将数据库拷贝的熬data/data 里面

    方法如下:

   

private void storeDatabase() {
        File dbDir = new File("data/data/" + getPackageName() + "/databases");
        if (!dbDir.exists()) {
            boolean su = dbDir.mkdirs();
        }
        File dbFile = new File("data/data/" + getPackageName() + "/databases/default"); //default 需要注意,这就是你之后在初始化数据库时保持一直的字段
        if (dbFile.exists()) {
            Log.v("TAG", "file already exist ,No need to Create");
        } else {
            InputStream is = null;
            FileOutputStream fos = null;
            try {
                dbFile.createNewFile();
                System.out.println("File Created successfully");
                is = getAssets().open("default.db");
                fos = new FileOutputStream(dbFile);
                byte[] buffer = new byte[1024];
                int length = 0;
                while ((length = is.read(buffer)) > 0) {
                    fos.write(buffer, 0, length);
                }
                System.out.println("File succesfully placed on sdcard");
                // Close the streams
                fos.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (fos != null) {
                        fos.close();
                    }
                    if (is != null) {
                        is.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

     4】使用时的初始化操作:

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "default", null); // default与上面强调字符保持一致
    mDB = helper.getWritableDatabase();
    mDaoMaster = new DaoMaster(mDB);
    mDAOSession = mDaoMaster.newSession();
    mDefDao = mDAOSession.getDefaultBaseDao();


    接下来你就可以正常使用啦


4、关于升级

GreenDAO的升级很简单

在 DaoMaster 类里面有个 public static class DevOpenHelper extends OpenHelper {}的内部类

我们在他的onUpgrade方法里面,判断oldVersion,然后做相应的表及表字段的添加处理就OK了。

5、一些注意事项

1)使用SQL修改数据库之后,需要执行mDAOSession.clear();否则得不到最新数据

2)没有单独更新某个字段的API,如果想仅仅更新某个字段,需要自己写SQL

3)想起来再写


转载于:https://my.oschina.net/zhibuji/blog/657972

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值