Android room数据库简单操作

1.room数据库结构

QQ图片20211104173808.png

2.添加依赖:

implementation'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0'

implementation'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0'

implementation'androidx.lifecycle:lifecycle-extensions:2.2.0'

implementation"androidx.activity:activity-ktx:1.2.0-beta01"

implementation'com.kunminx.archi:unpeek-livedata:4.5.0-beta1'

def room_version ="2.3.0"

implementation"androidx.room:room-runtime:$room_version"

implementation"androidx.room:room-ktx:$room_version"

kapt"androidx.room:room-compiler:$room_version"

3.构建项目

image
@Entity
data class Record(
    @PrimaryKey(autoGenerate = true)//表主键 ,autoGenerate = true 自增
    val id: Long = 0,
    @ColumnInfo(name = "title")
    val title: String,
    @ColumnInfo(name = "content")
    val content: String,
    /**
     * Room会利用@Entity注解的类的所有字段来创建表的列,
     * 如果某些字段不希望存储的话,使用@Ignore注解该字段即可
     */
    @Ignore
    val bitmap: Bitmap?
)
@Dao
interface RecordDao {
    @Query("select * from record where title = :title")
    fun getAllRecordsByTitle(title: String): Flow<List<Record>>

    @Query("select * from record")
    fun getAllRecords(): Flow<List<Record>>

    @Insert
    suspend fun insert(vararg record: Record?)

    @Update
    fun update(vararg record: Record?)

    @Delete
    fun delete(vararg record: Record?)
}
//每次创建AppDatabase实例都会产生比较大的开销,所以应该将AppDatabase设计成单例的
@Database(
    entities = [Record::class],
    version = 2,
    exportSchema = false
)
abstract class AppDataBase : RoomDatabase() {

    abstract fun recordDao(): RecordDao

    companion object {
        private var instance: AppDataBase? = null

        // 使用单例模式

        fun getDatabase(context: Context): AppDataBase  {

            return instance?: synchronized(this){
                Room.databaseBuilder(
                    context.applicationContext,
                    AppDataBase::class.java, "app_database"
                ).build().also { instance = it }
            }
        }
    }
}
class HomeViewModel(app: Application) : AndroidViewModel(app) {

    private val recordDao by lazy {
        AppDataBase.getDatabase(getApplication()).recordDao()
    }

    fun getAllRecord(){
        viewModelScope.launch {
            recordDao.getAllRecords().collect {
                Log.e("TAG", "getAllRecord: $it", )
            }
        }
    }

    fun addRecord(title:String,content:String){
        viewModelScope.launch {
            recordDao.insert(Record(0,title,content))
        }
    }
}
class MainActivity : AppCompatActivity() {
    private lateinit var mBinding: ActivityMainBinding

    private val vm by viewModels<HomeViewModel>()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        mBinding.btnAdd.setOnClickListener {
           vm.addRecord(mBinding.etTitle.text.toString(),mBinding.etContent.text.toString())
        }
        mBinding.btnFind.setOnClickListener {
            vm.getAllRecord()
        }
    }
}

4.room数据库与liveData和flow无缝连接,直接使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容