一、引入依赖
//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、、、、、、");
}
}
};