标签:
你需要在你的主Android工程之外再建立一个generator project.这是一个纯java的项目。
1)创建Java工程(generator工程)
(2)导入greenDao-generator.jar和freemarker.jar两个包。
(3)创建一个类(名字都可以),创建main方法。在这个main方法中创建一个schema对象,创建该对象时,需要制定数据库的版本号、默认的Java package等参数。默认Java package用来存放生成的entity、DAO文件、test代码。如:
Schema schema =
new
Schema(
1
,
"de.greenrobot.daoexample"
);
那么接下来就是向
schema 中添加想要生成的entity,以及entity中想要的property(对应着数据表的字段)。如:
Entity note = schema.addEntity(
"Note"
);
note.addIdProperty();
note.addStringProperty(
"text"
).notNull();
note.addStringProperty(
"comment"
);
note.addDateProperty(
"date”
);
完成了generator工作之后后面的东西就简单了:
(1)创建一个android工程
(2)在一个.java文件写一个应用:note表中插入一个Note对象(一行数据):
DevOpenHelper helper = new DaoMaster.DevOpenHelper( this , "notes-db" , null ); //上面生成的entity所对应的表生成在哪个数据库中 db = helper.getWritableDatabase(); daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); noteDao = daoSession.getNoteDao(); Note note = new Note( null , noteText, comment, new Date()); noteDao.insert(note); noteDao.deleteByKey(id); 如果有两个表,一个是note表,一个是picture表,note表的一行数据对应着picture表的唯一一行数据,那么我们现在想通过Note这个entity对象的实例note1 直接调用getPicture()方法来得到这个note1(对应着note表的一行)所唯一对应的picture表中的那一行数据(也就是Picture(java类)这个entity对象对应的一个Picture实例picture1)
那么怎么得到呢?
(这里的user,picture都是entity的对象,不是一个User类或picture类的对象
)
这样以后我们就可以调用note 类(这个类是entity的对象)的一个实例
note1的getPicture()方法(get picture的picture是指的表的名字,而不是getpictureid,因为我们得到的确实是picture的实例。不用传参数,因为我这个note1对应的pictureid是已知的,直接对能对应picture表中有该pictureid值的那一行了,所以不用传参,这个getPicture方法是我们按上面的步骤做了 自动产生的)来得到picture表对应的那一行数据。
如果我们还想我们的note1直接得到picture表中对应的另一个唯一数据picturesmall(和pictureid一样,note 表和picture表都有这个字段,也是唯一对应的,因为我们的get picture方法是同一个表的表明,没法区分,所以要再设名字),例如:
这时候我们想得到note1所对应的picture表中相同的picturesmall的那一行的时候,我们要调用
note1.getThumbnail()。
刚才所的是一对一的关系,还有一对多的关系。也就是说我们这时候picture表中pictureid不是唯一的,多行都可以有相同的pictureid,这时候我们就不能使用刚才说的addToOne,而是使用addToMany,这样我们调用note1这个Note类实例的getPictures(多了一个s)方法,就得到了picture表中pictureid为note1中的pictureid值的所有行(返回的是一个List )。
注意通过getpcitures以后得到的list是会缓存的,我们之后在查询时就会从缓存中拿,所以在删除或者增加修改picture数据库表以后,我们要重置清空list这个缓存,这个缓存存在note1中,所以要
note1.resetPictures()。
最后说一下查询:
举个例子:
查询以Joe为名,以姓排序的所有用户.
再说一个查询例子:嵌套条件的例子:获取出生在1970年10月以后名为Joe的所有用户. 我们将用户生日对应到实体的年、月、日属性.
我们使用更正式的形式将查询条件表达为:名是Joe AND(生日的年份大于1970 OR(生日的年是1970 AND 生日的月等于或大于10))
当你使用QueryBuilder对象的一个方法来获取结果,
QueryBuilder内部使用Query类来进行处理。所以如果你要以相同的条件多次进行查询的时候,你可以调用QueryBuilder的build()方法来产生一个Query,先不需要执行它,之后需要多次查询的时候就可以直接使用这个query对象来进行查询(调用unique()或者list()),而没必要再创建QueryBuilder。具体的:
如果查询条件没有变,你只需要再次调用其中一个list/unique方法.如果参数有改变,你必须对改变的参数调用setParameter方法.目前,各个参数以0开始的索引来区分.对应你传入参数到QueryBuilder的索引.
使用这个Query对象,我们查找名为Marias,出生在1977年的用户:
调用Query或者QueryBuilder的unique()方法,它会给你唯一的结果或者null(如果没有找到匹配的实体).如果你的情况不允许null作为结果,调用uniqueOrThrow(),它会保证返回非空的实体(如果没有匹配的结果,它会抛出DaoException异常).
如果查询时你期望返回多个结果,你可以调用list...中的一个方法:结果是一个典型的ArrayList.
参考:
|
标签:
原文地址:http://www.cnblogs.com/happylion/p/4788051.html