(Translated by https://www.hiragana.jp/)
GitHub - xieyangxuejun/sample-android-room: room数据库框架使用
Skip to content

xieyangxuejun/sample-android-room

Repository files navigation

sample-android-room

roomすうすえ库框使用しよう

基本きほんかい

Room中有ちゅうう三个主要的组件:

  • Database:你可以用这个组件らい创建いち个database holder。注解ちゅうかいてい义实たいてきれつひょう,类的内容ないようてい义从すうすえ库中获取すうすえてき对象(DAO)。它也そこ层连せってき主要しゅよう入口いりくち。这个注解ちゅうかいてき类是いち个继承RoomDatabaseてき抽象ちゅうしょう类。ざい运行时,以通过调ようRoom.databaseBuilder() あるもの Room.inMemoryDatabaseBuilder()らいいた它的实例。

  • Entity:这个组件代表だいひょう一个持有数据库的一个表的类。对每いち个entity,都会とかい创建一个表来持有这些item。你必须在Database类中てきentitiesすう组中引用いんよう这些entity类。entityちゅうてきごといち个fieldはた持久じきゅういたかずすえ库,じょ使用しようりょう@Ignore注解ちゅうかい

  • DAO:这个组件代表だいひょういち个作为Data Access Objecてき类或しゃせっこう。DAORoomてき主要しゅよう组件,负责てい义查询(添加てんかあるもの删除とうすうすえ库的方法ほうほう使用しよう@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())
    }

总结いち

以当なり单独てき块来使用しよう, forkしかきさきうつし自己じこてきEntities就行りょう.

About

roomすうすえ库框使用しよう

Resources

License

Stars

Watchers

Forks

Packages

No packages published