Android GreenDao使用注意事项

注解:

@Entity   标识实体类,greenDAO会映射成sqlite的一个表,表名为实体类名的大写形式

@Id 标识主键,该字段的类型为long或Long类型,autoincrement设置是否自动增长

@Property       标识该属性在表中对应的列名称, nameInDb设置名称

@Transient      标识该属性将不会映射到表中,也就是没有这列

@NotNull         设置表中当前列的值不可为空

@Convert         指定自定义类型(@linkPropertyConverter)

@Generated   greenDAO运行所产生的构造函数或者方法,被此标注的代码可以变更或者下次运行时清除

@Index    使用@Index作为一个属性来创建一个索引;定义多列索引(@link Entity#indexes())

@JoinEntity     定义表连接关系

@JoinProperty         定义名称和引用名称属性关系

@Keep     注解的代码段在GreenDao下次运行时保持不变

         1.注解实体类:默认禁止修改此类
          2.注解其他代码段,默认禁止修改注解的代码段

@OrderBy        指定排序

@ToMany         定义与多个实体对象的关系

@ToOne  定义与另一个实体(一个实体对象)的关系

@Unique 向数据库列添加了一个唯一的约束
@NameInDb:有的时候数据库中的字段跟你的对象字段不匹配的时候,可以使用此注解。

DaoMaster:用于创建数据库以及获取DaoSession
DaoSession:用于获取各个表对应的Dao类,可以缓存数据.


DatabaseManager.getInstance().getSession().clear();//清楚 session 的所有缓存
DatabaseManager.getInstance().getSession().getStudentDao().deleteAll(); // 清除 StudentDao的缓存

各个表对应的Dao:提供了对表进行增删改查的方法,以及表的各个字段,表名等属性.


升级

任何修改都应该对数据库升级.
数据库升级: build.gradle中数据库版本增高.

greendao {
    schemaVersion 1 //数据库版本号增加
    daoPackage 'com.jrsj.neuronvision.gen'
    targetGenDir 'src/main/java'
}


如果不操作,数据库之前保存的数据都会消失.默认是删除所有表,再创建所有表,清除所有数据.
如果用三方,需要在MySQLiteOpenHelper中指定dao的class.
插入数据

insert: 如果主键已存在,再插入主键一致的数据时,会崩溃.
insertOrReplace: 如果主键已存在,再插入主键一致的数据时,会更新数据.
删除

delete 也是基于deleteByKey,只不过是先找到key,然后在调用deleteByKey
@Id(autoincrement = true)

设置主键为自动增长.如果之前表中最后一条数据主键为10,主键列表为1,2,3,4,5,6,7,8,9,10,将这条数据删除之后,再新增一条数据,那么新增的数据的id是11,而不是10.那么数据id是1,2,3,4,5,6,7,8,9,11,缺少10.,也就是说主键会一直比增长,不管你曾经是否删除过.
如果不添加(autoincrement = true),那么索引一直是连续的,即使中途删除过元素.
每一个实体bean都应该有一个主键

如果没有设置主键,那么实体bean不能更新,更新时会提示

does not have a single-column primary key

1,如果表单有唯一id,那么这个id可以设置成主键.
2,如果这个表单没有id,那么需要我们添加一个id,@Id,如果需要自增,可以添加(autoincrement = true),同时id应该使用Long,大写的L.那么在创建bean对象的时候,主键应该设置null,设置成null才能自动增长,如果设置成一个固定的值,那么这个id只能是那个固定的值.
查询

得到所有数据

loadAll()

unique()返回唯一一条数据
unique()方法可以用来返回唯一一条数据, 如果只存在一条,那么正常返回,如果存在多条,会崩溃.
1,如果某个字段添加注释@id,或者@unique,表示它是唯一的,因此在查询的时候可以利用unique()方法来获取这唯一一行的数据.
2,如果字段不是唯一的,但是采用了unique方法来获取,如果查询到的列表中有两条数据,那么会崩溃.并提示Expected unique result, but count was 2.

与条件查询

 List<Student> jin3 = studentDao.queryBuilder().where(StudentDao.Properties.Age.eq("1"), StudentDao.Properties.Name.eq("jin1")).list();

或条件查询

 List<Student> jin3 = studentDao.queryBuilder().whereOr(StudentDao.Properties.Age.eq("1"), StudentDao.Properties.Name.eq("jin3")).list();

复杂查询,与条件与或条件同时存在
或和与需要用()分隔开来

 List<Student> students = studentDao.queryRawCreate(" where (  id = ? and name = ?  ) or ( id = ?  )", "0", "jin0", "1").list();

多表查询、两表关联查询、自关联查询

  以下是官方实例:涉及三个实例City, Country, and Continent.查询欧洲的所有人数超过一百万的所有城市:
    QueryBuilder qb = cityDao.queryBuilder().where(Properties.Population.ge(1000000));
    Join country = qb.join(Properties.CountryId, Country.class);
    Join continent = qb.join(country, CountryDao.Properties.ContinentId, Continent.class, ContinentDao.Properties.Id);
    continent.where(ContinentDao.Properties.Name.eq("Europe"));
    List<City> bigEuropeanCities = qb.list();
 
    QueryBuilder<User> queryBuilder = userDao.queryBuilder();
    queryBuilder.join(Address.class, AddressDao.Properties.userId)
    .where(AddressDao.Properties.Street.eq("Sesame Street"));
    List<User> users = queryBuilder.list();
 
    QueryBuilder qb = userDao.queryBuilder();
    qb.where(Properties.FirstName.eq("Joe"),
    qb.or(Properties.YearOfBirth.gt(1970),
    qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值