android - 房间数据库丢失数据

标签 android kotlin android-room

我正在使用 Kotlin 语言开发一个 Android 项目,我正在使用来自 Android 架构组件的 Room 数据库。这些都是我的房间数据库的东西。我试图让用户保存有关一本书的信息,当我在应用程序中时它工作正常,但当我重新启动应用程序时,所有内容都已被删除。我需要将数据存储在内存中,因此我正在使用 inMemoryDatabaseBuilder 但它似乎不起作用。感谢您的帮助。

依赖关系:

dependencies {
    def room_version = "1.1.1"
    implementation "android.arch.persistence.room:runtime:$room_version"
    kapt "android.arch.persistence.room:compiler:$room_version"
}

apply plugin: 'kotlin-kapt'

实体:

@Entity(tableName = "tblBooks")
data class BookData(@PrimaryKey(autoGenerate = true) var id: Long?,
                    @ColumnInfo(name = "name") var name: String,
                    @ColumnInfo(name = "author") var author: String,
                    @ColumnInfo(name = "translator") var translator: String,
                    @ColumnInfo(name = "publisher") var publisher: String,
                    @ColumnInfo(name = "publication_year") var publicationYear: Int?,
                    @ColumnInfo(name = "price") var price: Int?,
                    @ColumnInfo(name = "description") var description: String,
                    @ColumnInfo(name = "category") var category: String,
                    @ColumnInfo(name = "shelf_number") var shelfNumber: Int?,
                    @ColumnInfo(name = "front_cover") var frontCover: String?,
                    @ColumnInfo(name = "back_cover") var backCover: String?
){
    constructor():this(null, "", "", "", "", 0, 0, "", "",
            0, "", "")
}

道:

@Dao
interface BookDataDao {

    @Query("SELECT * FROM tblBooks")
    fun getAll(): List<BookData>

    @Insert(onConflict = REPLACE)
    fun insert(bookData: BookData)


}

数据库:

@Database(entities = [BookData::class], version = 1)
abstract class BookDatabase: RoomDatabase(){

    abstract fun bookDataDao(): BookDataDao

    companion object {
        private var INSTANCE: BookDatabase? = null

        fun getInstance(context: Context): BookDatabase? {
            if (INSTANCE == null){
                synchronized(BookDatabase::class){
                    INSTANCE = 
                    Room.inMemoryDatabaseBuilder(context.applicationContext,
                            BookDatabase::class.java).build()
                }
            }
            return INSTANCE
        }
    }
}

用法: 插入数据:

val database = BookDatabase.getInstance(this) !!
database.bookDataDao().insert(bookData)

检索数据:

val database = BookDatabase.getInstance(this) !!
val booksList = database.bookDataDao().getAll()

最佳答案

如果您只存储在内存中,那么您的数据库在应用程序启动之间不会持续存在是正常的。根据documentation :

Information stored in an in memory database disappears when the process is killed

意思是每次你终止应用程序时,数据库也会关闭。如果您希望它持久存在,您应该改用标准的 databaseBuilder,它将放在设备存储中。

关于android - 房间数据库丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52497502/

相关文章:

android - 如何从 Firebase 存储下载图像文件到 SD 卡

java - 如何使recyclerview无限滚动(向下/向上)?

android - 将 Android Room 与 Kotlin Coroutines 一起使用的正确方法是什么?

java - 改造 1.9 以使用 jhipster oauth 响应未填充

android - 如何在两个 fragment 之间传递数据?

android - 如何在 Jetpack Compose 中制作虚线/虚线?

kotlin - 在 Kotlin 中使用任何 setter 时有没有办法调用函数

Android Room,错误的列名和列不可为空

android - 将 MediatorLiveData 迁移到 SharedFlow

android - 我正在尝试在此 ListView 中添加图像