首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.lang.RuntimeException:计算数据库活动数据时的异常

java.lang.RuntimeException:计算数据库活动数据时的异常
EN

Stack Overflow用户
提问于 2022-07-22 17:07:30
回答 1查看 931关注 0票数 2

我学习教室库创建应用程序与sqlite数据库,但我得到了一个错误。在第一次启动时,当我将item添加到DB时,它使用RecyclerView导航到片段,1秒后我的应用程序崩溃。

误差

代码语言:javascript
复制
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

代码语言:javascript
复制
@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

我的道斯

代码语言:javascript
复制
@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>>

}

我的存储库

代码语言:javascript
复制
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()
    }

}

我的视图模型

代码语言:javascript
复制
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

代码语言:javascript
复制
@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的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-22 22:22:17

你的问题是,按照Row的说法,它太大了,不适合CursorWindow requiredPos=0,totalRows=1

虽然您已经成功地存储了数据,但它太大,无法提取。A CursorWindow必须能够存储至少1整行

  • CursorWindows的存储限制在1Mb到4Mb之间(取决于设备及其API/版本)。

图像(如位图)通常大于极限。在数据库中存储图像是不可取的。

建议将图像存储为文件,然后存储路径或足够的路径,以便从数据库中识别图像。

  • 可以访问数据的方式,例如块。例如,您可以提取列的长度,然后提取各部分并将它们组合起来。但是,不推荐这样的方法,因为它们很可能是inefficient.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73083812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档