我学习教室库创建应用程序与sqlite数据库,但我得到了一个错误。在第一次启动时,当我将item添加到DB时,它使用RecyclerView导航到片段,1秒后我的应用程序崩溃。
误差
E/SQLiteQuery: exception: Row too big to fit into CursorWindow requiredPos=0, totalRows=1; query: SELECT * FROM vet_product ORDER BY id ASC
E/AndroidRuntime: FATAL EXCEPTION: arch_disk_io_0
Process: com.dimon.vetdatabasemobile, PID: 26700
java.lang.RuntimeException: Exception while computing database live data.
at androidx.room.RoomTrackingLiveData$1.run(RoomTrackingLiveData.java:92)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:1001)
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:838)
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:153)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:140)
at com.dimon.vetdatabasemobile.db.dao_s.ProductDao_Impl$5.call(ProductDao_Impl.java:172)
at com.dimon.vetdatabasemobile.db.dao_s.ProductDao_Impl$5.call(ProductDao_Impl.java:163)
at androidx.room.RoomTrackingLiveData$1.run(RoomTrackingLiveData.java:90)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923) My models
@Parcelize
@Entity(tableName = "vet_product")
data class Product(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val productName: String,
val productPrice: Double,
val productImage: Bitmap
) : Parcelable
@Parcelize
@Entity(tableName = "cart")
data class CartModel(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
val productName: String,
val productPrice: Double
) : Parcelable我的道斯
@Dao
interface ProductDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(product: Product)
@Delete
fun delete(product: Product)
@Update
fun update(product: Product)
@Query("DELETE FROM vet_product")
fun deleteAll()
@Query("SELECT * FROM vet_product ORDER BY id ASC")
fun getAllProducts(): LiveData<List<Product>>
}
@Dao
interface CartDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insertToCart(cartModel: CartModel)
@Query("DELETE FROM cart")
fun deleteAllFromCart()
@Query("SELECT * FROM cart ORDER BY id ASC")
fun getCartModels(): LiveData<List<CartModel>>
}我的存储库
class ProductRepository(private val productDao: ProductDao) {
val getAllProduct: LiveData<List<Product>> = productDao.getAllProducts()
fun addProduct(product: Product) {
productDao.insert(product)
}
fun updateProduct(product: Product) {
productDao.update(product)
}
fun deleteProduct(product: Product) {
productDao.delete(product)
}
fun deleteAllProducts() {
productDao.deleteAll()
}
}
class CartRepository(private val cartDao: CartDao) {
val getAllCartModels: LiveData<List<CartModel>> = cartDao.getCartModels()
fun addToCart(cartModel: CartModel) {
cartDao.insertToCart(cartModel)
}
fun deleteAllFromCart() {
cartDao.deleteAllFromCart()
}
}我的视图模型
class ProductViewModel(application: Application) : AndroidViewModel(application) {
val getAllProducts: LiveData<List<Product>>
private val repository: ProductRepository
init {
val productDao = VetDatabase.getInstance(application).productDao()
repository = ProductRepository(productDao)
getAllProducts = repository.getAllProduct
}
fun addProduct(product: Product) {
viewModelScope.launch(Dispatchers.IO) {
repository.addProduct(product)
}
}
fun updateProduct(product: Product) {
viewModelScope.launch(Dispatchers.IO) {
repository.updateProduct(product)
}
}
fun deleteProduct(product: Product) {
viewModelScope.launch(Dispatchers.IO) {
repository.deleteProduct(product)
}
}
fun deleteAllProducts() {
viewModelScope.launch(Dispatchers.IO) {
repository.deleteAllProducts()
}
}
}
class CartViewModel(application: Application) : AndroidViewModel(application) {
val getCartModels: LiveData<List<CartModel>>
private val repository: CartRepository
init {
val cartDao = VetDatabase.getInstance(application).cartDao()
repository = CartRepository(cartDao)
getCartModels = repository.getAllCartModels
}
fun addToCart(cartModel: CartModel) {
viewModelScope.launch(Dispatchers.IO) {
repository.addToCart(cartModel)
}
}
fun deleteAllFromCart() {
viewModelScope.launch(Dispatchers.IO) {
repository.deleteAllFromCart()
}
}
}My DB
@Database(entities = [Product::class, CartModel::class], version = 5, exportSchema = false)
@TypeConverters(Converters::class)
abstract class VetDatabase : RoomDatabase() {
abstract fun productDao(): ProductDao
abstract fun cartDao(): CartDao
companion object {
@Volatile
private var INSTANCE: VetDatabase? = null
fun getInstance(context: Context): VetDatabase {
val tempInstance = INSTANCE
if (tempInstance != null) {
return tempInstance
}
synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
VetDatabase::class.java,
"vet_db"
)
.fallbackToDestructiveMigration()
.allowMainThreadQueries()
.build()
INSTANCE = instance
return instance
}
}
}
}但我注意到了图像的问题。一些图像项成功地添加到DB中,但在其他图像中,它以崩溃方式添加。我不知道怎么解决这个问题,在网上我什么也没发现。也许有人知道怎么纠正这个错误?
提前感谢fow的帮助!
发布于 2022-07-22 22:22:17
你的问题是,按照Row的说法,它太大了,不适合CursorWindow requiredPos=0,totalRows=1
虽然您已经成功地存储了数据,但它太大,无法提取。A CursorWindow必须能够存储至少1整行。
图像(如位图)通常大于极限。在数据库中存储图像是不可取的。
建议将图像存储为文件,然后存储路径或足够的路径,以便从数据库中识别图像。
。
https://stackoverflow.com/questions/73083812
复制相似问题