Room数据库框架的使用

一、引入依赖

//Room数据库框架

implementation "androidx.room:room-runtime:2.4.0"

annotationProcessor "androidx.room:room-compiler:2.4.0"

二、数据库的初始化

1、从studio的asset目录中,读取并复制到内存缓存中,

java 复制代码
try {
   ProjectListDataBase projectListDB = Room.databaseBuilder(mActivity.getApplicationContext(), ProjectListDataBase.class, GlobalConstant.BRIDGE_DETECT_DB_NAME)
            .setJournalMode(RoomDatabase.JournalMode.TRUNCATE)
            .createFromAsset(GlobalConstant.BRIDGE_DETECT_DB_NAME)
            .addMigrations(UpdateDB.BRIDGE_DETECT_MIGRATION_1_2)
            .allowMainThreadQueries()
            .build();
} catch (Exception e) {
    LogUtils.log(e.toString());
}

2、可以从指定路径中读取数据库

java 复制代码
  String dbPath = FileUtils.getFileBasePath() + File.separator + uid + File.separator +  File.separator + GlobalConstant.PROJECT_DB_NAME;
        File file = new File(dbPath);
        if (file.exists()) {
            projectDB = Room.databaseBuilder(getApplicationContext(), ProjectDataBase.class, dbPath)
                    .setJournalMode(RoomDatabase.JournalMode.TRUNCATE)
                    .addMigrations(UpdateDB.PROJECT_MIGRATION_1_2)
//                    .fallbackToDestructiveMigration()
                    .allowMainThreadQueries()
                    .build();
        } else {
            LogUtils.log("initProjectDB: 数据库不存在------");
        }

三、定义数据实体

java 复制代码
@Parcelize
@Entity(tableName = "project_member_check_result")
public class ResultListBean {

    @PrimaryKey
    @NonNull
    @ColumnInfo(name = "project_task_id")
    public Integer taskId;

    @NonNull
    @ColumnInfo(name = "check_user_id")
    public Integer checkUserId;

    @NonNull
    @ColumnInfo(name = "check_time")
    public String checkTime;

    @Ignore
    public int totalCount;

    @Ignore
    public int detectCount; //非表中字段

  
}

四、定义数据访问对象(DAO)

java 复制代码
@Dao
public interface ResultListDao {

    @Insert(onConflict = REPLACE)
    long insert(ResultListBean bean);

    @Query("SELECT * FROM project_member_check_result WHERE project_task_id= :taskId and create_user_id =:uid")
    ResultListBean getResultByTaskId(int taskId, int uid);

    @Query("delete from project_member_check_result where project_task_id= :taskId and create_user_id =:uid")
    int deleteByTaskId(int taskId, int uid);
}

五、‌创建数据库类(Database)

java 复制代码
@Database(entities = {ProjectListBean.class, ResultListBean.class},version = BRIDGE_DETECT_ROOM_VERSION,exportSchema = false)
public abstract class ProjectListDataBase extends RoomDatabase {

    public abstract ProjectListDao getProjectListDao();

    public abstract ResultListDao getResultListDao();

}

六、数据库的使用

java 复制代码
DiseaseDao  diseaseDao = projectDB.getDiseaseDao();
List<DiseaseBean> diseaseBeans = diseaseDao.getDiseaseListByLevel(bean.diseaseLevel, bean.typeUuid);

七、数据库的升级

在RoomDatabase中,初始化时,指定version。在第二步,数据库初始化的时候,提到方法 .addMigrations(UpdateDB.BRIDGE_DETECT_MIGRATION_1_2),,这是用来数据库升级的方法,代码中是从数据库版本1,升级到版本2

java 复制代码
 public static Migration BRIDGE_DETECT_MIGRATION_1_2 = new Migration(1, 2) {

        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            try {
               
                database.execSQL("CREATE TABLE IF NOT EXISTS 'tunnel_list' (" +
                        "'id' TEXT PRIMARY KEY NOT NULL, " +
                        "'company_id' INTEGER NOT NULL, " +
                        "'longitude' TEXT, " +
                        "'flag' INTEGER, " +
                        "'tunnel_id' INTEGER NOT NULL, " +
                        "'check_time' TEXT, " +
                        "'deck_pavement' INTEGER  )");

            } catch (Exception e) {
                LogUtils.log("BRIDGE_DETECT_MIGRATION_1_2、、、、、、");
            }
        }
    };
相关推荐
东风破_6 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
橙子家8 小时前
OSS 文件上传的几个风险点和解决方案
数据库
2601_962066499 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
愤怒的苹果ext10 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
数字新视界12 小时前
DCIM管理系统的技术架构与部署模式详解
数据库·物联网·数据中心·数据中心基础设施管理·dcim管理系统
何以解忧,唯有..12 小时前
Pydantic 介绍与使用:Python 数据校验的现代方案
数据库·python·microsoft
这个DBA有点耶13 小时前
数据库容灾进入“秒级时代”:同城双活架构原理、关键技术选型与落地实践
数据库·架构·dba
2601_9620748113 小时前
大数据-264 实时数仓 - Canal MySQL的binlog研究 存储目录 变动信息 配置MySQL
大数据·数据库·mysql
2601_9620738114 小时前
大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL
大数据·数据库·mysql
Frank_refuel14 小时前
【MYSQL进阶】-> 索引理解
数据库