作者:真正的爱情是什么2010 | 来源:互联网 | 2023-10-14 13:35
这边使用的是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 keys):使用事务操作删除数据库中给定的所有key所对应的实体
void deleteByKeyInTx(K... keys):使用事务操作删除数据库中给定的所有key所对应的实体
void deleteInTx(java.lang.Iterable entities):使用事务操作删除数据库中给定实体集合中的实体
void deleteInTx(T... entities):使用事务操作删除数据库中给定的实体 // 数据插入相关
long insert(T entity):将给定的实体插入数据库
void insertInTx(java.lang.Iterable entities):使用事务操作,将给定的实体集合插入数据库
void insertInTx(java.lang.Iterable entities, boolean setPrimaryKey):使用事务操作,将给定的实体集合插入数据库, 并设置是否设定主键
void insertInTx(T... entities):将给定的实体插入数据库
long insertOrReplace(T entity):将给定的实体插入数据库,若此实体类存在,则覆盖
void insertOrReplaceInTx(java.lang.Iterable entities):使用事务操作,将给定的实体插入数据库,若此实体类存在,则覆盖
void insertOrReplaceInTx(java.lang.Iterable entities, boolean setPrimaryKey):使用事务操作,将给定的实体插入数据库,若此实体类存在,则覆盖 并设置是否设定主键
void insertOrReplaceInTx(T... entities):使用事务操作,将给定的实体插入数据库,若此实体类存在,则覆盖
long insertWithoutSettingPk(T entity):将给定的实体插入数据库,但不设定主键 // 新增数据插入相关API
void save(T entity):将给定的实体插入数据库,若此实体类存在,则更新
void saveInTx(java.lang.Iterable entities):将给定的实体插入数据库,若此实体类存在,则更新
void saveInTx(T... entities):使用事务操作,将给定的实体插入数据库,若此实体类存在,则更新 // 加载相关
T load(K key):加载给定主键的实体
java.util.List loadAll():加载数据库中所有的实体
protected java.util.List loadAllAndCloseCursor(android.database.Cursor cursor) :从cursor中读取、返回实体的列表,并关闭该cursor
protected java.util.List 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 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 List queryRaw(Class entityClass, String conditions) {
List list = (List) mDaoSession.getDao(entityClass).queryRaw(conditions);return list;}
上面这个方法可以通过传入entity类,condition写入的内容相当于 “select * from entityTable”+conditions,例如
List resultlist = queryRaw(TableEntity.class,"where name='张三'")
还有一种原生的查询就是直接通过调用数据库db:
Cursor cursor = mDaoMaster.getDatabase().rawQuery(sql, params);
这种方式要自己去调用数据库关闭。
上面就是一些GreenDao的常用注解和api方法