gpt4 book ai didi

android-room - 房间持久性库 - 创建 View

转载 作者:行者123 更新时间:2023-12-03 16:14:58 24 4
gpt4 key购买 nike

我需要在使用 Room Persistence Library 的查询中使用 SQL VIEW。
使用 Commonsware 的答案 here 我已经能够在数据库创建期间运行原始 SQL 语句来创建 View 。

 Room.databaseBuilder(context, MyDatabase.class, DB_NAME)
.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
db.execSQL("CREATE VIEW view_name " +
"AS SELECT [...] "
);
}
})
.build();
VIEW 实际上是在 SQLite DB 上创建的并且工作正常,但是我无法在我的 Dao 的 @Query 中引用它,因为我收到一个编译时错误:

Error:(100, 48) error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such table: view_name)


关于如何让 Room 了解我的观点或忽略错误的任何想法?

最佳答案

更新 17/12/2018

Room 持久性库的 2.1.0 及更高版本现在提供对 SQLite 数据库 View 的支持:
https://developer.android.com/training/data-storage/room/creating-views
(见 D-D 的评论)

更新 15/12/2017

请注意,此解决方案实际上会破坏数据库迁移。

问题在于 View 中显然不存在的实体主键,因此迁移无效。

CommonsWare's comment对于可能的hacky解决方法。

原答案

目前使用 Room 似乎无法做到这一点。

无论如何,我已经使用解决方法完成了它:我创建了一个与 View 具有相同名称和列的实体(实际上只有名称是必需的),这将在 DB 上创建一个表并允许您在没有编译时错误的查询。

然后在 Room DB 创建期间,我在 CREATE VIEW 之前删除了这个实体的表。

Room
.databaseBuilder(context, DueDatabase.class, DB_NAME)
.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
//Drop the fake table and create a view with the same name
db.execSQL("DROP TABLE view_name");
db.execSQL("CREATE VIEW view_name " +
"AS SELECT [...]"
);
}
})
.build();

关于android-room - 房间持久性库 - 创建 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46452786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com