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)想起来再写