• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

ROOM数据库的使用和升级

武飞扬头像
卖火柴的大兄弟
帮助1

项目中使用了GreenDao创建数据库,建立了一个库并在其中生成了2个表,现在做整体优化,想使用Room创建数据库,毕竟Room是谷歌官方产品,还是值得尝试一波的。

一:对于Room的使用,关注三个点:

1.创建Entity:直接上代码(部分代码省略)

第一个Entity

  1.  
    @Entity(tableName = "login_history_table")
  2.  
    public class LoginHistory {
  3.  
    @PrimaryKey(autoGenerate = true)
  4.  
    Long id;
  5.  
     
  6.  
    @ColumnInfo
  7.  
    private String account;
  8.  
     
  9.  
    @ColumnInfo
  10.  
    private String pwd;
  11.  
     
  12.  
    @ColumnInfo
  13.  
    private String name;
  14.  
    @ColumnInfo
  15.  
    private String quickLoginToken;
  16.  
    @ColumnInfo
  17.  
    private String token;
  18.  
    @ColumnInfo
  19.  
    private String photo;
  20.  
    @ColumnInfo
  21.  
    private int userId;
  22.  
    @ColumnInfo
  23.  
    private long time;
  24.  
     
  25.  
    @ColumnInfo
  26.  
    private int loginState = 0;
  27.  
     
  28.  
    @ColumnInfo
  29.  
    private int isInvalid = 0;
  30.  
     
  31.  
    }
学新通

第二个Entity

  1.  
    @Entity(tableName = "stat_event")
  2.  
    data class StatEvent(
  3.  
    @PrimaryKey(autoGenerate = true) val id: Int,
  4.  
    @ColumnInfo(name = "actionCode")
  5.  
    var actionCode: String? = null,
  6.  
    @ColumnInfo(name = "userId")
  7.  
    var userId: Int? = null,
  8.  
    @ColumnInfo(name = "reportTime")
  9.  
    var reportTime: Long? = null,
  10.  
    @ColumnInfo(name = "params1")
  11.  
    var params1: String? = null,
  12.  
    @ColumnInfo(name = "params2")
  13.  
    var params2: String? = null,
  14.  
    ) {
  15.  
     
  16.  
    }
学新通

2.创建对应Dao:

  1.  
    @Dao
  2.  
    interface LoginHistoryDao {
  3.  
     
  4.  
    @Insert
  5.  
    fun insert(history: LoginHistory)
  6.  
     
  7.  
    @Delete
  8.  
    fun delete(history: LoginHistory)
  9.  
     
  10.  
    @Update
  11.  
    fun update(history: LoginHistory)
  12.  
     
  13.  
    @Query("select * from login_history_table order by time desc")
  14.  
    fun getAllHistory(): List<LoginHistory>?
  15.  
     
  16.  
    @Query("select * from login_history_table order by time desc limit :count")
  17.  
    fun getHistoryLimit(count: Int): List<LoginHistory>?
  18.  
     
  19.  
    @Query("select * from login_history_table where userId=:id")
  20.  
    fun getHistory(id: Int): LoginHistory?
  21.  
    }
学新通
  1.  
    @Dao
  2.  
    interface StatEventDao {
  3.  
     
  4.  
    @Insert
  5.  
    fun insert(list: List<StatEvent>)
  6.  
     
  7.  
    @Insert()
  8.  
    fun insert(event: StatEvent)
  9.  
     
  10.  
    @Query("select * from stat_event")
  11.  
    fun getAllEvent(): List<StatEvent>?
  12.  
     
  13.  
    @Delete
  14.  
    fun deleteAll(events: List<StatEvent?>?)
  15.  
    }
学新通

3.创建数据库db单例类:

  1.  
    @Database(entities = [StatEvent::class,LoginHistory::class], version = 2)
  2.  
    abstract class StatEventDb : RoomDatabase() {
  3.  
    abstract fun statEventDao(): StatEventDao
  4.  
     
  5.  
    abstract fun loginHistoryDao(): LoginHistoryDao
  6.  
     
  7.  
    companion object {
  8.  
    private var instance: StatEventDb? = null
  9.  
     
  10.  
    fun get(context: Context): StatEventDb {
  11.  
    if (instance == null) {
  12.  
    //注释2
  13.  
    instance = Room.databaseBuilder<StatEventDb>(context, StatEventDb::class.java, "stat_event.db")
  14.  
    .fallbackToDestructiveMigration()
  15.  
     
  16.  
    //是否允许在主线程进行查询
  17.  
    .allowMainThreadQueries()
  18.  
    .build()
  19.  
    }
  20.  
    return instance!!
  21.  
    }
  22.  
     
  23.  
    }
  24.  
    }
学新通

4.使用示例:

StatEventDb.get(BaseApplication.getInstance()).statEventDao().insert(event)

二:升级:

我们做个示例,针对于其中一个表做升级,对

login_history_table  表格增加一个字段,testVersion。

直接上代码:

1.Entity改变:

  1.  
    @Entity(tableName = "login_history_table")
  2.  
    public class LoginHistory {
  3.  
    @PrimaryKey(autoGenerate = true)
  4.  
    Long id;
  5.  
     
  6.  
    @ColumnInfo
  7.  
    private String account;//邮箱或者手机号码
  8.  
     
  9.  
    @ColumnInfo
  10.  
    private String pwd;
  11.  
     
  12.  
    @ColumnInfo
  13.  
    private String name;
  14.  
    @ColumnInfo
  15.  
    private String quickLoginToken;
  16.  
    @ColumnInfo
  17.  
    private String token;
  18.  
    @ColumnInfo
  19.  
    private String photo;
  20.  
    @ColumnInfo
  21.  
    private int userId;
  22.  
    @ColumnInfo
  23.  
    private long time;
  24.  
    //0:未登录,1:已登录,2:正在登陆中
  25.  
    @ColumnInfo
  26.  
    private int loginState = 0;
  27.  
    //0:正常,1:失效
  28.  
    @ColumnInfo
  29.  
    private int isInvalid = 0;
  30.  
     
  31.  
    @ColumnInfo
  32.  
    private long testVersion=0;
  33.  
    }
学新通

2.DB类的改变:

  1.  
    @Database(entities = [StatEvent::class, LoginHistory::class], version = 3)
  2.  
    abstract class StatEventDb : RoomDatabase() {
  3.  
    abstract fun statEventDao(): StatEventDao
  4.  
    abstract fun luckyCartDao(): LuckyCartDao
  5.  
    abstract fun loginHistoryDao(): LoginHistoryDao
  6.  
     
  7.  
    companion object {
  8.  
    private var instance: StatEventDb? = null
  9.  
     
  10.  
    fun get(context: Context): StatEventDb {
  11.  
    if (instance == null) {
  12.  
    //注释2
  13.  
    instance = Room.databaseBuilder<StatEventDb>(context, StatEventDb::class.java, "stat_event.db")
  14.  
    .fallbackToDestructiveMigration()
  15.  
    //添加升级策略
  16.  
    .addMigrations(Migration2_3())
  17.  
    //是否允许在主线程进行查询
  18.  
    .allowMainThreadQueries()
  19.  
    .build()
  20.  
    }
  21.  
    return instance!!
  22.  
    }
  23.  
     
  24.  
    }
  25.  
    }
学新通

3.Migration2_3类:

  1.  
    class Migration2_3 : Migration(2, 3) {
  2.  
    override fun migrate(database: SupportSQLiteDatabase) {
  3.  
     
  4.  
    database.execSQL("CREATE TABLE temp_Stat_event ("
  5.  
    "id INTEGER PRIMARY KEY NOT NULL,"
  6.  
    "actionCode TEXT,"
  7.  
    "userId INTEGER,"
  8.  
    "reportTime INTEGER,"
  9.  
    "params1 TEXT,"
  10.  
    "params2 TEXT)");
  11.  
    database.execSQL("INSERT INTO temp_Stat_event (id, actionCode, userId,reportTime,params1,params2) "
  12.  
    "SELECT id, actionCode, userId,reportTime,params1,params2 FROM stat_event");
  13.  
    database.execSQL("DROP TABLE stat_event");
  14.  
    database.execSQL("ALTER TABLE temp_Stat_event RENAME TO stat_event");
  15.  
     
  16.  
     
  17.  
     
  18.  
    database.execSQL("CREATE TABLE temp_login_history_table ("
  19.  
    "id INTEGER PRIMARY KEY,"
  20.  
    "account TEXT,"
  21.  
    "pwd TEXT,"
  22.  
    "name TEXT,"
  23.  
    "quickLoginToken TEXT,"
  24.  
    "token TEXT,"
  25.  
    "photo TEXT,"
  26.  
    "userId INTEGER,"
  27.  
    "time INTEGER,"
  28.  
    "loginState INTEGER NOT NULL DEFAULT null,"
  29.  
    "isInvalid INTEGER NOT NULL DEFAULT null)" )
  30.  
     
  31.  
    database.execSQL("INSERT INTO temp_login_history_table (id, account, pwd,name,quickLoginToken,token,photo,userId,time,loginState,isInvalid) "
  32.  
    "SELECT id, account, pwd,name,quickLoginToken,token,photo,userId,time,loginState,isInvalid FROM login_history_table");
  33.  
    database.execSQL("DROP TABLE login_history_table");
  34.  
    database.execSQL("CREATE TABLE login_history_table ("
  35.  
    "id INTEGER PRIMARY KEY,"
  36.  
    "account TEXT,"
  37.  
    "pwd TEXT,"
  38.  
    "name TEXT,"
  39.  
    "quickLoginToken TEXT,"
  40.  
    "token TEXT,"
  41.  
    "photo TEXT,"
  42.  
    "userId INTEGER NOT NULL,"
  43.  
    "time INTEGER NOT NULL,"
  44.  
    "loginState INTEGER NOT NULL DEFAULT null,"
  45.  
    "isInvalid INTEGER NOT NULL DEFAULT null,"
  46.  
    "testVersion INTEGER NOT NULL )")
  47.  
     
  48.  
    database.execSQL("INSERT INTO login_history_table (id, account, pwd,name,quickLoginToken,token,photo,userId,time,loginState,isInvalid,testVersion) "
  49.  
    "SELECT id, account, pwd,name,quickLoginToken,token,photo,userId,time,loginState,isInvalid ,0 FROM temp_login_history_table");
  50.  
    database.execSQL("DROP TABLE temp_login_history_table");
  51.  
    }
  52.  
    }
学新通

对于Migration2_3说明:

对于版本2升级到版本3时,重新创建需要改变的表,创建新的字段,并把旧数据保存进去。对于不改变的表不用执行sql语句,所以上述的stat_event表可以不用执行sql。  上述的sql语句也有部分可以优化。

遇到的报错日志:学新通

 对于上述报错,仔细看下错误信息会发现,上面是Expected期望的数据类型,下面是Found执行发现的数据类型,对比会发现不太一样,直接按照Expected的去更改就行。

以上是Room使用的一波体验,希望能给大家有所帮助。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcccgf
系列文章
更多 icon
同类精品
更多 icon
继续加载