room
Room
-
Database:你可以用这个组件
来 创建一 个database holder。注解 定 义实体 的 列 表 ,类的内容 定 义从数 据 库中获取数 据 的 对象(DAO)。它也是 底 层连接 的 主要 入口 。这个被 注解 的 类是一 个继承RoomDatabase的 抽象 类。在 运行时,可 以通过调用 Room.databaseBuilder()或 者 Room.inMemoryDatabaseBuilder()来 得 到 它的实例。 -
Entity:这个组件
代表 一个持有数据库的一个表的类。对每一 个entity,都会 创建一个表来持有这些item。你必须在Database类中的 entities数 组中引用 这些entity类。entity中 的 每 一 个field都 将 被 持久 化 到 数 据 库,除 非 使用 了 @Ignore注解 。 -
DAO:这个组件
代表 一 个作为Data Access Objec的 类或者 接 口 。DAO是 Room的 主要 组件,负责定 义查询(添加 或 者 删除等 )数 据 库的方法 。使用 @Database注解 的 类必须包含 一 个0参 数 的 ,返 回 类型为@Dao注解 过的类的抽象 方法 。Room会 在 编译时生成 这个类的实现。
- @Entity,
将 这个类转换成数 据 表 , indices表 指数 , primaryKeys主 键[]数 组类型 ,和 其他 - @Igore,如果
不 喜 欢存数 据
@Entity(tableName = "user")
data class User(
val name: String,
val sex: Int,
@PrimaryKey(autoGenerate = true)
val id: Long = 0,
val createAt: Long = System.currentTimeMillis()
)
- @Dao,
数 据 操作 接 口 .
@Dao
interface UserDao {
//多 个数据
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(vararg user: User): List<Long>
@Delete
fun delete(vararg user: User): Int
@Update
fun update(vararg user: User): Int
@Query("SELECT * FROM user")
fun queryAll(): List<User>
@Query("SELECT * FROM user WHERE id IN (:userIDs)")
fun queryByUserIds(vararg userIDs: Long): List<User>
@Query("SELECT * FROM user WHERE id = :id")
fun queryById(id: Long): User
}
- @Database,
新建 数 据 表 在 这里添加 ,和 版本 号 ,如果数 据 改 变一定要改变版本号
@Database(entities = arrayOf(
User::class
), version = databaseVersion)
abstract class AppDatabase : RoomDatabase() {
abstract fun getUserDao(): UserDao
}
- 创建,
使用 单例,这样不用 每次 创建了 ,但 是 room给了一 方法 ==>Room.inMemoryDatabaseBuilder(context, User::class.java)
@SuppressLint("StaticFieldLeak")
class AppDatabaseManager {
private var mContext: Context? = null
private var mAppDatabase: AppDatabase? = null
companion object {
@Volatile
private var mInstance: AppDatabaseManager? = null
fun getInstance(): AppDatabaseManager {
if (mInstance == null) {
synchronized(AppDatabaseManager::class.java) {
if (mInstance == null) {
mInstance = AppDatabaseManager()
}
}
}
return mInstance!!
}
}
fun init(app: Application) {
mInstance?.run {
if (mContext == null) {
mContext = app.applicationContext
}
mAppDatabase = Room.databaseBuilder(
mContext!!, AppDatabase::class.java, databaseName
).build()
}
}
fun getUserDao(): UserDao = mAppDatabase?.getUserDao()!!
}
- 如果id
自 增 ,需要 放 在 data class后 面 赋值为0,网上说需要 无参数 的 构造函数 ,不 需要 注解 @field: SerializedName("user_name")和 @ColumnInfo(name = "user_name"),前者 是 序列 化 的 变量名 ,后 者 是 数 据 表 的 变量名 .如果不 写 就用类成员变量 名 .重点 :不要 在 主 线程操作 数 据 (CRUD).....- Insert
插入 多 个数据 返 回 的 是 List ids - delete
也有 返 回 值是Int,删除的 个数,同 update - 查询就有很多
了 ..order..like..=..
初 始 化
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Stetho.initializeWithDefaults(this)
AppDatabaseManager.getInstance().init(this.application)
}
增 删改查
fun clickInsert(view: View) {
getFlowable({
AppDatabaseManager.getInstance().getUserDao().insert(*arrayOf(
User("谢杨学 君 ", 1, 1),
User("谢杨学 君 ", 1, 2),
User("谢杨学 君 ", 1),
User("谢杨学 君 ", 1),
User("谢杨学 君 ", 1)
))
}).subscribe({
Log.d("===>", "success (size= ${it.size} and ${it.joinToString()})")
}).isDisposed
}
fun clickDelete(view: View) {
getFlowable({
AppDatabaseManager.getInstance().getUserDao().delete(*arrayOf(
User("谢杨学 君 ", 1, 1),
User("谢杨学 君 ", 1, 2)
))
}).subscribe({
Log.d("===>", "success (count = $it)")
}).isDisposed
}
fun clickUpdate(view: View) {
getFlowable({
AppDatabaseManager.getInstance().getUserDao().delete(*arrayOf(
User("谢杨学 君 ", 1),
User("谢杨学 君 ", 2)
))
}).subscribe({
Log.d("===>", "success (count = $it)")
}).isDisposed
}
fun clickQueryAll(view: View) {
getFlowable({
AppDatabaseManager.getInstance().getUserDao().queryAll()
}).subscribe({
val fromList = JsonParserUtil.fromList(it)
tv_message.text = fromList
}).isDisposed
}
fun <T> getFlowable(method: () -> T): Flowable<T> {
return object : Flowable<T>() {
override fun subscribeActual(s: Subscriber<in T>) {
try {
s.onNext(method.invoke())
} catch (e: Exception) {
e.printStackTrace()
s.onError(e)
}
s.onComplete()
}
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}