关闭

GreenDao理解

144人阅读 评论(0) 收藏 举报

1.实体类的注解:
在Java代码中使用实体类代表我们需要持久化的数据。3.0以后由我们编写实体类,并添加注解。
1)@Entity
该实例是类的注解,告诉greenDAO这个类是需要持久化的实体类
2)@ID,field注解,表示选择一个long或Long类型的属性作为该实体所对应数据库中数据表的主键,参数可以设置(autoincreament=true)
3)@Property,field注解,可以自定义该属性在数据表的列名,默认的列名为属性名大写,并由下划线隔开多个单词
4)@NotNull对应着数据表中该列不能为空
5)@Transient与Java中的Transient关键字类似,指不对该属性持久化,即不为该属性在数据表中创建相应列
6)@Index为属性创建索引,有name和unique两个参数,name可以为索引指定名称,unique与数据表中建立索引的unique含义一致
7)@Generated greenDAO会根据开发者定义的实体类定义schema,并生成DAOs,而在生成过程中会为开发者编写的实体类的一些方法和域上添加@Generated注解,该注解只是提示开发者,避免对此域或方法代码的修改,如果想手动对其修改则需要改成@Keep注解,但是会影响后面的持久化过程。最好不要这样做。
2.Sessions
greenDAO为我们生成的类中包括DaoMaster,DaoSession和一些实体对应的DAOs,而前两个是greenDAO的机制中核心的接口。
每一个DaoMaster持有一个数据库连接,通过DaoMaster.newSession()方法可以实例化多个Session,这些Session对应同一个数据库连接,但是系统会为每一个Session分配内存,在这片内存中会为实体进行缓存。每一个Session对应一个Identity scope
从DaoSession中可以获取各实体类的对应DAO,然后就可以进行增删改查的操作了,对于每一个Session中的查询操作都会对查到的实体类做缓存操作,所以对应同一个Session的多次查询操作,如果entity的对象在该Session中有对应缓存则直接使用,而不再从数据库中读取数据并构建新的实体类对象。
3.查询
QueryBuilder的基本使用方法
通过DAOs的queryBuilder()方法构建一个构造器对象,然后对该构造器设置查询,排序条件等,最后获取查询结果。
QueryBuilder qb = userDao.queryBuilder(); //获取QueryBuilder
qb.where(Properties.FirstName.eq("Joe")) //设置查询条件
.orderAsc(Properties.LastName) //设置排序
.list(); //返回查询结果

greenDAO提供Query类用于返回查询结果,通过QueryBuilder.build()方法返回这一次查询的Query对象
返回单个结果:使用unique()或uniqueOrThrow(),返回单个结果,如果没有满足条件的结果,前者返回null, 后者抛出异常
返回所有结果:使用list(): 在内存中构建所有满足条件的实体类对象,通常保存到ArrayList中
1)多次查询

Query query = userDao.queryBuilder().where(
Properties.FirstName.eq("Joe"), Properties.YearOfBirth.eq(1970))
.build();
List joesOf1970 = query.list();
query.setParameter(0, "Maria");
query.setParameter(1, 1977);
List mariasOf1977 = query.list();

2)多线程查询
需要调用Query的forCurrentThread()返回Thread Local的Query对象。通过该对象可以执行线程安全的查询,无需锁。
4.连接

QueryBuilder<User> queryBuilder = userDao.queryBuilder();
queryBuilder.join(Address.class, AddressDao.Properties.userId)
  .where(AddressDao.Properties.Street.eq("Sesame Street"));
List<User> users = queryBuilder.list();

由于可以默认连接某个数据表的主键,所以可以省略连接源或目的的属性,因此join()方法有如下三种重载形式:

/**
* Expands the query to another entity type by using a JOIN. The primary key property of the primary entity for
* this QueryBuilder is used to match the given destinationProperty.
*/
public <J> Join<T, J> join(Class<J> destinationEntityClass, Property destinationProperty)

/**
 * Expands the query to another entity type by using a JOIN. The given sourceProperty is used to match the primary
 * key property of the given destinationEntity.
 */
public <J> Join<T, J> join(Property sourceProperty, Class<J> destinationEntityClass)

/**
 * Expands the query to another entity type by using a JOIN. The given sourceProperty is used to match the given
 * destinationProperty of the given destinationEntity.
 */
public <J> Join<T, J> join(Property sourceProperty, Class<J> destinationEntityClass, Property destinationProperty)

greenDao是对sqlite数据库操作的封装,可以让我们更加方便的使用sqlite,它不是使用反射的机制,而是直接生成相关代码。这就大幅度提升了它的性能
这里写图片描述
greenDao是将一个Java对象直接映射到了数据库中。

greenDAO的优势
1.一个精简的库
2.性能最大化
3.内存开销最小化
4.易于使用的APIs
5.对Android进行高度优化

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13066次
    • 积分:488
    • 等级:
    • 排名:千里之外
    • 原创:34篇
    • 转载:6篇
    • 译文:3篇
    • 评论:2条
    文章存档
    最新评论