android - 房间数据库丢失数据
问题描述
我正在使用 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()
解决方案
如果您只存储在内存中,那么您的数据库在应用程序启动之间不会持续存在是正常的。根据文档:
当进程被杀死时,存储在内存数据库中的信息会消失
这意味着每次您终止应用程序时,数据库也会关闭。如果你希望它是持久的,你应该使用标准的 databaseBuilder 代替,它将被放在设备存储中。
推荐阅读
- c# - 添加新数据后,起订量不会验证 DbSet 和 DbContext 上的操作
- c++ - 动态数组大小来计算矩阵的行列式
- css - 图像对齐未正确设置为右上角
- linux - 找不到 FASTA 索引
- c# - C# .NET 控制台应用程序获取键盘输入
- python - lst[:] = [1,2,3] 是什么意思?
- python - Python - 当变量仅在错误时使用时,使用全局变量或传递给函数是更好的做法吗
- docker - 通过 google-fluentd 使来自 Docker 容器的 JSON 日志字段在 GCP 日志中可用
- android - 用于 recyclerview 项目的数组加倍
- parsing - 从 CBS 网站提取所有季节和剧集视频链接