Android kotlin+协程+Room数据库的简单使用

Room

Room是Google为了简化旧版的SQLite操作专门提供的
1.拥有了SQLite的所有操作功能
2.使用简单(类似于Retrofit),通过注解的方式实现相关功能。编译时自动生成实现类impl
3.LiveData,LifeCycle,Paging天然融合支持

导入

...

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
    id 'kotlin-kapt'
}

dependencies {
    //room数据库
    implementation "androidx.room:room-runtime:2.2.5"
    kapt "androidx.room:room-compiler:2.2.5" // Kotlin 使用 kapt
    implementation "androidx.room:room-ktx:2.2.5"//Coroutines support for Room 协程操作库

    //lifecycle
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0'
}

User

package com.zhangyu.myroom.data

import android.os.Parcelable
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.android.parcel.Parcelize

@Parcelize
@Entity(tableName = "User")
data class User(
    @PrimaryKey
    var id: String,
    var name: String
) : Parcelable

UserDao

package com.zhangyu.myroom.data

import androidx.room.*

@Dao
interface UserDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun putUser(cacheBean: User)

    @Query("select * from User where id =:id")
    suspend fun getUser(id: String): User?

    @Query("select * from User")
    suspend fun getAllUser(): List<User>?

    @Delete
    fun delete(user: User)

    @Update(onConflict = OnConflictStrategy.REPLACE)
    fun update(user: User)

}

UserDatabase

package com.zhangyu.myroom.data

import android.util.Log
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase
import com.zhangyu.myroom.App

private const val TAG = "CacheDataBase"

//后续的数据库升级是根据这个version来比较的,exportSchema导出架构
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase : RoomDatabase() {
    companion object {
        var dataBase: UserDatabase

        init {
            //如果databaseBuilder改为inMemoryDatabaseBuilder则创建一个内存数据库(进程销毁后,数据丢失)
            dataBase = Room.databaseBuilder(App.context, UserDatabase::class.java, "db_user")
                //是否允许在主线程进行查询
                .allowMainThreadQueries()
                //数据库创建和打开后的回调,可以重写其中的方法
                .addCallback(object : Callback() {
                    override fun onCreate(db: SupportSQLiteDatabase) {
                        super.onCreate(db)
                        Log.d(TAG, "onCreate: db_user")
                    }
                })
                //数据库升级异常之后的回滚
                .fallbackToDestructiveMigration()
                .build()
        }

    }

    abstract fun getUserDao(): UserDao
}

MainActivity

package com.zhangyu.myroom

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.zhangyu.myroom.data.User
import com.zhangyu.myroom.data.UserDatabase
import kotlinx.coroutines.launch

private const val TAG = "MainActivity"

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        testCache()
    }

    private fun testCache() {
        val userDao = UserDatabase.dataBase.getUserDao()
        userDao.putUser(User("1001", "zhangyu"))
        userDao.putUser(User("1002", "liming"))

        lifecycleScope.launch {
            val users = userDao.getAllUser()
            Log.e(TAG, "users: $users")
            val user = userDao.getUser("1001")
            Log.e(TAG, "user: $user")
            Log.e(TAG, "testCache: 协程执行完毕")
        }

        Log.e(TAG, "testCache: ")

    }


}

结果

E/MainActivity: testCache: 
E/MainActivity: users: [User(id=1001, name=zhangyu), User(id=1002, name=liming)]
E/MainActivity: user: User(id=1001, name=zhangyu)
E/MainActivity: testCache: 协程执行完毕
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android,连接Room数据库和避免数据丢失可以通过以下方式来实现: 1. 使用SQLiteOpenHelper创建数据库:你可以使用SQLiteOpenHelper类来创建你的数据库。SQLiteOpenHelper是一个Android内置的类,它可以帮助你处理数据库和表的创建、版本升级和数据库的备份。在你的应用程序,你可以使用它来创建和管理你的数据库。 2. 使用Room连接数据库Room是一个Android内置的持久化库,它提供了一个抽象层,使得你可以在应用程序轻松地访问和操作SQLite数据库Room库可以帮助你避免因为数据库版本升级而导致的数据丢失问题,因为它可以自动处理数据库升级和降级。 下面是一个使用Room连接数据库的示例: 首先,在你的应用程序添加Room库的依赖: ``` dependencies { def room_version = "2.3.0" implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" // 如果你需要使用RxJava或Kotlin协程,还需要添加以下依赖: implementation "androidx.room:room-rxjava2:$room_version" implementation "androidx.room:room-ktx:$room_version" kapt "androidx.room:room-compiler:$room_version" } ``` 然后,你需要定义一个抽象类来作为你的Room数据库: ``` @Database(entities = {User.class}, version = 1) public abstract class MyAppDatabase extends RoomDatabase { public abstract UserDao userDao(); } ``` 在这个示例,我们定义了一个名为MyAppDatabase的抽象类,并使用@Database注释指定了数据库的名称、版本和实体类。我们还定义了一个抽象方法userDao(),用来返回一个数据访问对象。 接下来,在你的应用程序创建一个Room数据库实例: ``` MyAppDatabase db = Room.databaseBuilder(getApplicationContext(), MyAppDatabase.class, "my_app_database.db").build(); ``` 在这个示例,我们使用databaseBuilder()方法创建一个MyAppDatabase对象,并指定了数据库的名称和版本号。 最后,在你的应用程序使用Room数据库实例来执行操作,比如查询、插入、更新或删除数据: ``` List<User> users = db.userDao().getAllUsers(); ``` 在这个示例,我们使用userDao()方法获取了一个数据访问对象,并使用getAllUsers()方法查询了所有用户的数据。 总的来说,使用Room库连接数据库可以帮助你更加方便地管理和访问SQLite数据库,并避免因为数据库版本升级而导致的数据丢失问题。同时,你还可以使用SQLiteOpenHelper类来创建和管理你的数据库,它也提供了一些有用的方法来帮助你避免数据丢失问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值