注解:
@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))));