JetPack 之Room的使用

500 阅读2分钟

背景

在刚开始学习android时候,我们大都采用android原生自带的数据库操作方法,后来经过了greedao->litepal框架的产生,一直到现在room的框架的产生,总体来说,让数据库操作变得越来越方便,下面主要给大家介绍room的使用.

一.依赖包引入

(1)添加kapt插件的使用

apply plugin: 'kotlin-kapt'

(2)添加room依赖包

//room
implementation 'androidx.room:room-runtime:2.3.0-alpha01'
implementation 'androidx.room:room-common:2.3.0-alpha01'
implementation 'androidx.room:room-ktx:2.3.0-alpha01'
kapt "androidx.room:room-compiler:2.3.0-alpha01"

二.编写实体类

@Entity(tableName = "tb_user_info")
data class User (
  @ColumnInfo(name = "user_name") var userName: String,
  @ColumnInfo(name = "address") var address: String,
  ){
  
  @PrimaryKey(autoGenerate = true)
  var id:Long=0
  /**
   * 忽略参数必须添加默认值
   */
  @Ignore
   var sex: Boolean =false
}

trip:这里需要注意下,在定义一个实体类的时候,只能把需要用到的参数传到方法里面,其他忽略参数必须要定义到形参之外,如设置id自动增长和忽略参数变量就不属于传递参数,否则不能正常编译,并且会报相关异常.

三、UserDao接口类

@Dao
interface UserDao {

    @Query("select * from tb_user_info where id = :id")
    fun getUserById(id: Long): User
    //查询全部
    @Query("select * from tb_user_info ")
    fun getUsers(): List<User>


    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun addUser(user: User)

    @Delete
    fun deleteUserByUser(user: User):Int

    @Update
    fun updateUserByUser(user: User):Int
    @Query("delete from tb_user_info")
    fun deleteAll():Int
}

四.定义AppDatabase类

@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {

    abstract fun userDao(): UserDao

    companion object {
        private var instance: AppDatabase? = null
        fun getInstance(context: Context): AppDatabase {
            if (instance == null) {
                instance = Room.databaseBuilder(context.applicationContext,
                    AppDatabase::class.java,
                    "user.db")
                        //数据库升级,前面为起始版本,后为升级版本
                    .addMigrations(object:Migration(1,2){
                        override fun migrate(database: SupportSQLiteDatabase) {
                            //新增电话号码字段
                            database.execSQL("alter table tb_user_info add phone INTEGER")

                        }

                    })
                    .allowMainThreadQueries()
                    .build()
            }

            return instance as AppDatabase
        }

    }

}

五.MainActivity

class MainActivity : AppCompatActivity() {
    private var userDao: AppDatabase? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        userDao = AppDatabase.getInstance(this)
    }

    fun add(view: View) {
        for (i in (0 until 10)) {
            val user = User(userName = "张三${i}", address = "地址:${i}")
            userDao?.userDao()?.addUser(user);
        }

    }

    fun query(view: View) {

        val users = userDao?.userDao()?.getUsers()?.forEach {
            Log.e("user", "==用户Id${it.id},姓名:${it.userName},地址:${it.address}")
        }


    }

    @SuppressLint("WrongConstant")
    fun delete(view: View) {
        var  user=User("","");
        user.id=1
        val deleteUserByUser = userDao?.userDao()?.deleteUserByUser(user)
        if(deleteUserByUser!! >0){
            Toast.makeText(this,"删除成功",1000).show()
        }else{
            Toast.makeText(this,"id不存在",1000).show()

        }

    }

    fun update(view: View) {

        val user = User("张三", "修改地址")
        user.id = 1
        val updateUserByUser = userDao?.userDao()?.updateUserByUser(user)
        Log.e("ss", updateUserByUser.toString())
    }

    fun deleteAll(view: View) {
        userDao?.userDao()?.deleteAll()

    }
}

六.结果

image.png

七.导出数据库到本地查看

使用Room框架后,发现在data->pageName->database下有三个目录,比如导出xx.db 你会发现什么看不到,而且xx.db size也没有发生变化,那是因为room已经做了分库处理。我们在导出的时候需将三个文件导入到本地统一文件夹下,再通过Navicat Premium 12以上版本进行导入。这样它能自动给我们进行合并,如:

image.png

image.png

image.png

这样就能完整的查看我们的数据结构,由于我是新手,我在这里也弄了一点时间

end

本篇文章适用于新手,如有错误之处请一一指教。