jectpack之room

room数据库使用

roombase

@Database(
    entities = [Repo::class, RemoteKeys::class],
    version = 1,
    exportSchema = false
)
abstract class RepoDatabase : RoomDatabase() {

    abstract fun reposDao(): RepoDao
    abstract fun remoteKeysDao(): RemoteKeysDao

    companion object {

        @Volatile
        private var INSTANCE: RepoDatabase? = null

        fun getInstance(context: Context): RepoDatabase =
            INSTANCE ?: synchronized(this) {
                INSTANCE
                    ?: buildDatabase(context).also { INSTANCE = it }
            }

        private fun buildDatabase(context: Context) =
            Room.databaseBuilder(
                context.applicationContext,
                RepoDatabase::class.java, "Github.db"
            )
                .build()
    }
}

创建roomdatabase数据库,该类需要标记注解Database,entities(表),version(版本号)

exportschema查看注释可以知道

the database schema will be exported into the given folder

如果设置为true的话,数据库将会导入到指定的文件夹中

设置好database之后就可以写sql语句了定义一个类

@Dao
interface RepoDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertAll(repos: List<Repo>)

    @Query(
        "SELECT * FROM repos WHERE " +
            "name LIKE :queryString OR description LIKE :queryString " +
            "ORDER BY stars DESC, name ASC"
    )
    fun reposByName(queryString: String): PagingSource<Int, Repo>

    @Query("DELETE FROM repos")
    suspend fun clearRepos()
}

一般就是增删改查

同时model类也需要加上数据库的注解

@Entity(tableName = "repos")
data class Repo(
    @PrimaryKey @field:SerializedName("id") val id: Long,
    @field:SerializedName("name") val name: String,
    @field:SerializedName("full_name") val fullName: String,
    @field:SerializedName("description") val description: String?,
    @field:SerializedName("html_url") val url: String,
    @field:SerializedName("stargazers_count") val stars: Int,
    @field:SerializedName("forks_count") val forks: Int,
    @field:SerializedName("language") val language: String?
)

这样就可以开始使用了

RepoDatabase.getInstance(context).reposDao().insertAll(repos)

最后增删改查可以返回很多种类型

rxjava

 @Insert(onConflict = OnConflictStrategy.REPLACE)
 fun insertAll(repos: List<Repo>):Maybe<List<CycleCode>>

用法

RepoDatabase.getInstance(context).reposDao().insertAll(repos).subscribeOn(Schedulers.io()).toObservable()
.observeOn(AndroidSchedulers.mainThread().subscribe {
}

livedata

  @Insert(onConflict = OnConflictStrategy.REPLACE)
  fun insertAll(): LiveData<List<CycleCode>>

用法

RepoDatabase.getInstance(context).reposDao().insertAll(repos).observe(this){                    }

flow

@Query("SELECT * FROM User")fun getAllUsers(): Flow<List<User>>

用法

RepoDatabase.getInstance(context).reposDao().getAllUsers(repos).collect{}

协程

@Insert(onConflict = OnConflictStrategy.REPLACE)suspend fun insertUsers(vararg users: User)

用法

在viewmodel中viewModelScope.launch(Dispatchers.Main) {     val data = RepoDatabase.getInstance(context).reposDao().insertUsers(repos)}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值