这边使用的是GreenDao3.1,它的注解都在greendao-api-3.1.0下
下面是常用注解的意义:
@Entity:
public @interface Entity {
/**
* 在数据库中表的名称,默认为实体的类名
*/
String nameInDb() default "";
/**
* 定义索引,可以跨越多个列(默认为实体类成员变量的个数)
*/
Index[] indexes() default {};
/**
* 标记创建数据库表
* 若一个表映射多个实体类或者创建表外应的GreenDao,设置为false
*/
boolean createInDb() default true;
/**
* 告知GreenDao当前实体属于哪个schema
*/
String schema() default "default";
/**
* 实体活动状体标志位(默认为false)
* 若设置为true,实体有更新、删除和刷新方法
*/
boolean active() default false;
}
@Convert:
这个类十分有用,可以讲数据库中字段类型与entity中的类型进行你需要的转换。
public @interface Convert {
/** 转换类*/
Class<? extends PropertyConverter> converter();
/**
* 在数据库中持久化的列
* 此受限于GreenDao所支持的类
*/
Class columnType();
}
@Id
设置主键 Long型,可以通过@Id(autoincrement = true)设置自增长。通过这个注解标记的字段必须是Long,数据库中表示它就是主键,并且默认是自增的。
public @interface Id {
/**
* 设置是否为自增长,默认为false
*/
boolean autoincrement() default false;
}
@Index
使用@Index作为一个属性来创建一个索引;定义多列索引(@link Entity#indexes())
public @interface Index {
/**
* 通过逗号间隔创建表的属性索引,例如 “propertyA,propertyB,propertyC”
* 若要指定排序, 需在列明以后添加 ASC(升序) 或者DESC(降序) , 例如 "propertyA DESC, propertyB ASC"
* 只有实体类中使用 {@link Entity#indexes()} 才可设置
*/
String value() default "";
/**
* 表的可选索引
* 默认为实体类中的成员变量
*/
String name() default "";
/**
* 是否为属性设置唯一属性,默认为false
*/
boolean unique() default false;
}
@JoinEntity
定义表连接关系
public @interface JoinEntity {
/** 添加的实体类 */
Class<?> entity();
/** 源表的列索引 */
String sourceProperty();
/** 连接表内拥有源实体的属性*/
String targetProperty();
}
@JoinProperty
定义名称和引用名称属性关系
public @interface JoinProperty {
/** 实体中的名称,对应于引用的名称 */
String name();
/** 引用的名称 */
String referencedName();
}
@OrderBy
排序public @interface OrderBy {
/**
* 通过逗号间隔创建表的属性索引,例如 “propertyA,propertyB,propertyC”
* 若要指定排序, 需在列明以后添加 ASC(升序) 或者DESC(降序) , 例如 "propertyA DESC, propertyB ASC"
* 默认按升序排序
* 若不设置默认根据主键排序
*/
String value() default "";
}
@Property
指定数据库数据表名public @interface Property {
/**
* 默认是的使用字段名
*/
String nameInDb() default "";
}
@Unique
向数据库列添加了一个唯一的约束
部分API
AbstractDao
dao是GreenDao中增、删、改所用的关键类,下面是它的一些关键api:void attachEntity(T entity):
long count():获取数据库中数据的数量
// 数据删除相关
void delete(T entity):从数据库中删除给定的实体
void deleteAll() :删除数据库中全部数据
void deleteByKey(K key):从数据库中删除给定Key所对应的实体
void deleteByKeyInTx(java.lang.Iterable<K> keys):使用事务操作删除数据库中给定的所有key所对应的实体
void deleteByKeyInTx(K... keys):使用事务操作删除数据库中给定的所有key所对应的实体
void deleteInTx(java.lang.Iterable<T> entities):使用事务操作删除数据库中给定实体集合中的实体
void deleteInTx(T... entities):使用事务操作删除数据库中给定的实体
// 数据插入相关
long insert(T entity):将给定的实体插入数据库
void insertInTx(java.lang.Iterable<T> entities):使用事务操作,将给定的实体集合插入数据库
void insertInTx(java.lang.Iterable<T> entities, boolean setPrimaryKey):使用事务操作,将给定的实体集合插入数据库,
并设置是否设定主键
void insertInTx(T... entities):将给定的实体插入数据库
long insertOrReplace(T entity):将给定的实体插入数据库,若此实体类存在,则覆盖
void insertOrReplaceInTx(java.lang.Iterable<T> entities):使用事务操作,将给定的实体插入数据库,若此实体类存在,则覆盖
void insertOrReplaceInTx(java.lang.Iterable<T> entities, boolean setPrimaryKey):使用事务操作,将给定的实体插入数据库,若此实体类存在,则覆盖
并设置是否设定主键
void insertOrReplaceInTx(T... entities):使用事务操作,将给定的实体插入数据库,若此实体类存在,则覆盖
long insertWithoutSettingPk(T entity):将给定的实体插入数据库,但不设定主键
// 新增数据插入相关API
void save(T entity):将给定的实体插入数据库,若此实体类存在,则更新
void saveInTx(java.lang.Iterable<T> entities):将给定的实体插入数据库,若此实体类存在,则更新
void saveInTx(T... entities):使用事务操作,将给定的实体插入数据库,若此实体类存在,则更新
// 加载相关
T load(K key):加载给定主键的实体
java.util.List<T> loadAll():加载数据库中所有的实体
protected java.util.List<T> loadAllAndCloseCursor(android.database.Cursor cursor) :从cursor中读取、返回实体的列表,并关闭该cursor
protected java.util.List<T> loadAllFromCursor(android.database.Cursor cursor):从cursor中读取、返回实体的列表
T loadByRowId(long rowId) :加载某一行并返回该行的实体
protected T loadUnique(android.database.Cursor cursor) :从cursor中读取、返回唯一实体
protected T loadUniqueAndCloseCursor(android.database.Cursor cursor) :从cursor中读取、返回唯一实体,并关闭该cursor
//更新数据
void update(T entity) :更新给定的实体
protected void updateInsideSynchronized(T entity, DatabaseStatement stmt, boolean lock)
protected void updateInsideSynchronized(T entity, android.database.sqlite.SQLiteStatement stmt, boolean lock)
void updateInTx(java.lang.Iterable<T> entities) :使用事务操作,更新给定的实体
void updateInTx(T... entities):使用事务操作,更新给定的实体
GreenDao查询语句
GreenDao的查询主要是通过QueryBuilder类
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))));
List youngJoes = qb.list();
其实很简单移动,就是把一些where 、and语句封装成了方法
执行原生的查询
public <T> List<T> queryRaw(Class<T> entityClass, String conditions) {
List<T> list = (List<T>) mDaoSession.getDao(entityClass).queryRaw(conditions);
上面这个方法可以通过传入entity类,condition写入的内容相当于 “select * from entityTable”+conditions,例如return list;}
List<TableEntity> resultlist = queryRaw(TableEntity.class,"where name='张三'")
还有一种原生的查询就是直接通过调用数据库db:
Cursor cursor = mDaoMaster.getDatabase().rawQuery(sql, params);
这种方式要自己去调用数据库关闭。
上面就是一些GreenDao的常用注解和api方法