尝试从 Room 数据库实例中检索值时抛出 IllegalStateException
IlegalStateException where thrown, while trying to retrieve values from RoomDatabase instance
我正在使用 android 新架构组件 room 进行数据库操作,当我尝试从数据库 [=16] 检索对象时遇到了麻烦=]
Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
这是我的 Dao 界面
@Dao
interface BookDao {
@Query("SELECT * FROM books")
fun getAllBooks() : List<Book>
@Insert
fun saveBook(book: Book)
@Query("DELETE FROM books")
fun deleteBookTable()
}
那是我的 table 模特 class
@Entity(tableName = "books")
data class Book(
@ColumnInfo(name = "book_title")
var title: String,
var imgRes: Int,
var filePath: String? = null,
var pdfInBytes: ByteArray? = null,
@PrimaryKey
@ColumnInfo(name = "_id")
var bookId: String = UUID.randomUUID().toString()
) : Serializable
这是 RoomDatabase 子项 class
@Database(entities = arrayOf(Book::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun bookDao(): BookDao
companion object {
@Volatile private var INSTANCE: AppDatabase? = null
fun getInstance(context: Context): AppDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(context.applicationContext,
AppDatabase::class.java, "booksDB.db")
.build()
}
}
这是我调用此方法的代码
private val db: AppDatabase by lazy { AppDatabase.getInstance(this) }
override fun onCreate(savedInstanceState: Bundle?) {
doAsync { // from anko library
for (i in 0..10){
val book = Book("$i", tmpImgRes, "tmpPath", tmpBytes)
db.bookDao().saveBook(book)
}
val books = db.bookDao().getAllBooks()
}
}
当我尝试调用 getAllBooks() 时抛出异常。
房间实施:
implementation "android.arch.persistence.room:runtime:1.0.0-rc1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-rc1"
我解决了我的问题,实际问题,在 SQLite table 行大小中,当我试图从 table 中获取数据时,该行包含超过 2.5 MB 的数据它在 SQLite 数据库中并不好,我通过拆分字节数组并按块保存它来减少数据的大小,之后每件事都完美地工作,在获取之后我将它合并为原始
我正在使用 android 新架构组件 room 进行数据库操作,当我尝试从数据库 [=16] 检索对象时遇到了麻烦=]
Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
这是我的 Dao 界面
@Dao
interface BookDao {
@Query("SELECT * FROM books")
fun getAllBooks() : List<Book>
@Insert
fun saveBook(book: Book)
@Query("DELETE FROM books")
fun deleteBookTable()
}
那是我的 table 模特 class
@Entity(tableName = "books")
data class Book(
@ColumnInfo(name = "book_title")
var title: String,
var imgRes: Int,
var filePath: String? = null,
var pdfInBytes: ByteArray? = null,
@PrimaryKey
@ColumnInfo(name = "_id")
var bookId: String = UUID.randomUUID().toString()
) : Serializable
这是 RoomDatabase 子项 class
@Database(entities = arrayOf(Book::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun bookDao(): BookDao
companion object {
@Volatile private var INSTANCE: AppDatabase? = null
fun getInstance(context: Context): AppDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(context.applicationContext,
AppDatabase::class.java, "booksDB.db")
.build()
}
}
这是我调用此方法的代码
private val db: AppDatabase by lazy { AppDatabase.getInstance(this) }
override fun onCreate(savedInstanceState: Bundle?) {
doAsync { // from anko library
for (i in 0..10){
val book = Book("$i", tmpImgRes, "tmpPath", tmpBytes)
db.bookDao().saveBook(book)
}
val books = db.bookDao().getAllBooks()
}
}
当我尝试调用 getAllBooks() 时抛出异常。
房间实施:
implementation "android.arch.persistence.room:runtime:1.0.0-rc1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-rc1"
我解决了我的问题,实际问题,在 SQLite table 行大小中,当我试图从 table 中获取数据时,该行包含超过 2.5 MB 的数据它在 SQLite 数据库中并不好,我通过拆分字节数组并按块保存它来减少数据的大小,之后每件事都完美地工作,在获取之后我将它合并为原始