Android平台下,使用编译期注解生成Java文件,拒绝低性能。一个SQLite数据库ORM的船新版本。增删改查建表,排序正序倒序唯一性,表索引,多线程并发读写都不在话下。确定不了解一下?
更新支持查询LiveData自动更新,自动跟随界面生命周期销毁资源
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
java:
dependencies {
annotationProcessor 'com.github.xiaolei123.RoomLite:compiler:0.1.4'
implementation 'com.github.xiaolei123.RoomLite:runtime:0.1.4'
}
kotlin:
dependencies {
kapt 'com.github.xiaolei123.RoomLite:compiler:0.1.4'
implementation 'com.github.xiaolei123.RoomLite:runtime:0.1.4'
}
public static class DataBase extends RoomLiteDatabase
{
public DataBase()
{
// 数据库名称
super("school");
}
// 所有的表Entity
@Override
public Class<?>[] getEntities()
{
return new Class[]{User.class};
}
// 是否允许在主线程中执行
@Override
public boolean allowRunOnUIThread()
{
return true;
}
// 数据库升级
@Override
public UpgradeOptions[] upgradeOptions()
{
return new UpgradeOptions[]{
// 版本1升级版本2,更新了表User
UpgradeOptions.upgrade(1, 2).update(User.class),
// 版本2升级版本3,新增了个表User3
UpgradeOptions.upgrade(2, 3).addTable(User3.class)
};
}
// 数据库版本
@Override
public int version()
{
return 1;
}
}
@Entity(name = "User")
public class User
{
@Column
@PrimaryKey(autoGenerate = true)
public int id;
public String name = "当前时间:" + System.currentTimeMillis();
@Ignore
public Bitmap bitmap;
}
@PrimaryKey(autoGenerate = true)
@Column(notNull = true)
@Column(unique = true)
@Column( defaultValue = "0")
@Ignore
public Bitmap bitmap;
第一步:在表类里声明自定义类型
@Entity(name = "User")
public class User
{
public Date date;
}
第二步:继承对应的转换器
public class DateConvert extends ToLongConvert<Date>
{
public DateConvert()
{
super(Date.class);
}
@Override
public Long convertToLong(Date javaObj)
{
Date date = (Date) javaObj;
if (javaObj == null)
return null;
return date.getTime();
}
/**
* 从数据库的Cursor获取数据,并转换成对应 javaType 类型的数据
*
* @param value
*/
@Override
public Date cursorToJavaObject(long value)
{
return new Date(value);
}
}
第三步:向RoomLite注册转换器
RoomLite.addConvert(new DateConvert());
@Entity(name = "User", indices = {
@Index(columnNames = {"id", "name"}),
@Index(name = "index2", columnNames = {"id", "name"}),
@Index(name = "index3", columnNames = {"id", "name"}, unique = true),
})
@Column(index = true)
@Dao
public interface UserDao
{
@Insert
public int addUser(User user);
@Delete
public int deleteUser(User user);
@Update
public void update(User user);
@Query(entity = User.class, limit = "0,1")
public User query();
}
DataBase dataBase = RoomLite.build(DataBase.class);
UserDao dao = dataBase.getDao(UserDao.class);
@Insert
public int addUser(User user);
@Insert
public void addUser(User[] users);
@Insert
public void addUserList(List<User> users);
@Delete
public int deleteUser(User user);
@Delete
public void deleteUser(User[] users);
@Delete
public void deleteUserList(List<User> users);
@Update
public int updateUser(User user);
@Update
public void updateUser(User[] users);
@Update
public void updateUserList(List<User> users);
// 查询所有
@Query(entity = User.class)
public List<User> queryAll();
// 查询第一个
@Query(entity = User.class, limit = "0,1")
public User query();
// 查询总数
@Query(what = "count(id)", entity = User.class)
public int queryCount();
// 查询所有的名字
@Query(what = "name", entity = User.class)
public String[] queryNames();
// 模糊查询
@Query(entity = User.class, whereClause = "name like ?")
public User[] querySearch(String name);
@Query(entity = User.class, whereClause = "name like ?",limit=@Limit(index = "0", maxLength = "30"))
@Query(entity = User.class, whereClause = "name like ?",limit=@Limit(index = "0", maxLength = "?"))
@Query(entity = User.class, orderBy = @OrderBy(columnNames = {"id"}, type = OrderBy.Type.ASC))
@Query(entity = User.class, orderBy = @OrderBy(columnNames = {"id"}, type = OrderBy.Type.DESC))
@Query(what = "name", entity = User.class)
public LiveData<String[]> queryNames();
End.