kotlin Room拒绝从预打包的数据库加载任何数据,即使它是使用自己的自动生成的查询创建的

m1m5dgzv  于 2023-08-06  发布在  Kotlin
关注(0)|答案(1)|浏览(118)

在过去的4个小时里,我一直在与空间作斗争,以便在我的预打包数据库中加载,我读了一些帖子,告诉我尝试找到_Impl.java文件,并检查那里生成的模式,所以我做了,并将我的数据库移动到该模式中,运行SQL查询以将数据加载到该DB中,再次导入它,然后...

再次被相同的吐司消息击中(还有,为什么是toast而不仅仅是日志?),对于可再生的例子,我试着只加载一个db实体,但这没有改变任何东西,我也没有什么想法了
创建项目的查询示例:

INSERT INTO products (title, image, price, description, category, rating, numberOfRatings) VALUES ("Retro Cat-Eye Sunglasses", "https://uploads-ssl.webflow.com/5b105a0c66f2f636c7884a17/64063dbcad97bd421b437096_chatgpt.jpg", 29.95, "Retro-inspired cat-eye sunglasses for a vintage look.", "Accessories", 4.4, 148);

字符串
数据库表创建查询(由房间生成):

CREATE TABLE IF NOT EXISTS `products` (`id` INTEGER NOT NULL, `title` TEXT NOT NULL, `price` REAL NOT NULL, `description` TEXT NOT NULL, `image` TEXT NOT NULL, `category` TEXT NOT NULL, `rating` REAL NOT NULL, `numberOfRatings` INTEGER NOT NULL, PRIMARY KEY(`id`))


我使用的实体:

@Entity(tableName = "products")
data class ProductEntity(
    @PrimaryKey val id: Int,
    val title: String,
    val price: Double,
    val description: String,
    val image: String,
    val category: String,
    val rating: Double,
    val numberOfRatings: Int
)


我按照文档,所以我相信房间是能够找到正确的资产(见图)
任何想法都会受到赞赏,因为我的理智已经消失了

kuhbmx9i

kuhbmx9i1#

好吧,我让它工作...方法如下:
1.找到YourDatabaseName_Impl文件(如果您看到相同的错误,则通常会生成该文件,请尝试按两次shift并从Entity类中搜索字段名称)
1.在文件中找到createAllTables函数,并复制包含表名(通常是第一个)的SQL查询
1.(编辑:在此步骤之前擦除模拟器数据可能是值得的)现在打开创建DB的地方(在我的情况下:a hilt module)添加类似于:

val rdc = object : RoomDatabase.Callback() {
    override fun onCreate(db: SupportSQLiteDatabase) {
        val SQL_CREATE_TABLE = "PASTE HERE THE QUERY YOU JUST COPIED"
        db.execSQL(SQL_CREATE_TABLE)
        val contentValues = ContentValues()
        // here we are manually created an entity, your table schema is definitevely different, so change this!
        contentValues.put("id", 0)
        contentValues.put("price", 12.99)
        contentValues.put("title", "yes")
        contentValues.put("description", "no")
        contentValues.put("image", "maybe.jpg")
        contentValues.put("category", "nonbin")
        contentValues.put("rating", 12.5)
        contentValues.put("numberOfRatings", 101)
        db.insert("YOUR TABLE NAME", OnConflictStrategy.REPLACE, contentValues)
    }
}

字符串
在顶端
然后将.addCallback(rdc)添加到数据库构建器中,如下所示:

Room.databaseBuilder(appContext, YourDatabaseNameHere::class.java, "YourDatabaseNameHereButSlightlyDifferentForRoomReasons.db")
                .addCallback(rdc)
                .build()


这将(希望)创建数据库和表+向表中添加一个项
(Test App在这里)
如果一切顺利:在android studio中找到设备资源管理器工具,选择正确的模拟器(在顶部),然后导航到:data -> data ->(在这里搜索您的包名,或者一个应用程序名,以找到匹配名称的目录)-> databases x1c 0d1x
然后右键单击.db文件并按“另存为”并将其保存在某个地方
你将有一个工作数据库,一个表,有正确的模式和一个示例项,现在你 * 应该 * 能够插入其他项目到表中(通常通过查询完成),之后你可以把数据库文件,移动到资产(在我的情况下,它是一个名为数据库的资产文件夹),并做:

Room.databaseBuilder(appContext, YourDatabaseName::class.java, "YourDatabaseNameHereButSlightlyDifferentForRoomReasons.db")
//                .addCallback(rdc)
                .createFromAsset("database/YourDatabaseName.db")
                .build()


但在此之前:擦除设备上的数据(只是为了确保)
应该能成功希望如此

相关问题