//只能传递对象的,更新时根据Cache中的主键 来比对的
@Update(onConflict = OnConflictStrategy.REPLACE)
void update(Cache… caches);
//获取表中所有数据
@Query(“select * from app_cache”)
List findAll();
//根据name来查找数据(这里是一对一,如果是一对多,这里可以写List)
@Query(“select * from app_cache where key
= :key”)
Cache findByKey(String key);
}
- 创建数据库
@Database(entities = {Student.class, Cache.class}, version = 1)
public abstract class RoomDataBase extends RoomDatabase {
private static final RoomDataBase database;
static {
//创建一个内存数据库
//但是这种数据库的数据只存在于内存中,也就是进程被杀之后,数据随之丢失
//Room.inMemoryDatabaseBuilder()
database = Room.databaseBuilder(AppGlobals.getApplication(), RoomDataBase.class, “jetpack_demo”)
//是否允许在主线程进行查询
.allowMainThreadQueries()
//数据库创建和打开后的回调
//.addCallback()
//设置查询的线程池
//.setQueryExecutor()
//.openHelperFactory()
//room的日志模式
//.setJournalMode()
//数据库升级异常之后的回滚
//.fallbackToDestructiveMigration()
//数据库升级异常后根据指定版本进行回滚
//.fallbackToDestructiveMigrationFrom()
//数据库升级的入口(如果没有配置升级的时候会将数据库内容全部清除)
// .addMigrations(CacheDatabase.sMigration)
.build();
}
/**
-
获取Student数据库操作对象
-
@return
*/
public abstract StudentDao getStudentDao();
/**
-
获取Cache数据库操作对象
-
@return
*/
public abstract CacheDao getCacheDao();
public static RoomDataBase get() {
return database;
}
/**
- 数据库升级的入口(如果没有配置升级的时候会将数据库内容全部清除)
*/
// static Migration sMigration = new Migration(1, 3) {
// @Override
// public void migrate(@NonNull SupportSQLiteDatabase database) {
// database.execSQL(“alter table teacher rename to student”);
// database.execSQL(“alter table teacher add column teacher_age INTEGER NOT NULL default 0”);
// }
// };
}
核心代码:
@Database(entities = {Student.class, Cache.class}, version = 1)
/**
-
获取Cache数据库操作对象
-
@return
*/
public abstract CacheDao getCacheDao();
- 创建缓存数据类(注意一定要序列化Serializable)
package cn.yumakeji.jetpackroomstudy.bean;
import java.io.Serializable;
public class CacheBean implements Serializable {
private String name;
private String title;
private long time;
private String imgUrl;
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImgUrl() {
return imgUrl;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return “CacheBean{” +
“name='” + name + ‘’’ +
“, title='” + title + ‘’’ +
“, time=” + time +
“, imgUrl='” + imgUrl + ‘’’ +
“, desc='” + desc + ‘’’ +
‘}’;
}
}
- 序列化和反序列化工具
package cn.yumakeji.jetpackroomstudy.room;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class RoomManager {
//反序列,把二进制数据转换成java object对象
public static Object toObject(byte[] data) {
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
bais = new ByteArrayInputStream(data);
ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bais != null) {
bais.close();
}
if (ois != null) {
ois.close();
}
} catch (Exception ignore) {
ignore.printStackTrace();
}
}
return null;
}
//序列化存储数据需要转换成二进制
public static byte[] toByteArray(T body) {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(body);
oos.flush();
return baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.close();
}
if (oos != null) {
oos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return new byte[0];
}
}
- 使用
/**
-
增加对象数据库
-
@param view
*/
public void onInsertDataClick(View view) {
for (int i = 0; i < 5; i++) {
CacheBean cacheBean = new CacheBean();
cacheBean.setName(“huang” + i);
cacheBean.setTime(System.currentTimeMillis());
cacheBean.setTitle(“测试数据” + i);
cacheBean.setDesc(“这是偶的描述信息” + i);
cacheBean.setImgUrl(“https://blog.csdn.net/huangxiaoguo1”);
Cache cache = new Cache();
cache.key = cacheBean.getName();
//序列化存储数据需要转换成二进制
cache.data = RoomManager.toByteArray(cacheBean);
总结:
面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。
有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。
附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
(“https://blog.csdn.net/huangxiaoguo1”);
Cache cache = new Cache();
cache.key = cacheBean.getName();
//序列化存储数据需要转换成二进制
cache.data = RoomManager.toByteArray(cacheBean);
总结:
面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。
有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。
附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!
[外链图片转存中…(img-hy0QJNVw-1715353133098)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!