房间持久性库 - 创建视图

Fra*_*sco 5 android-room

我需要在使用Room Persistence Library的查询中使用SQL VIEW.

在这里使用Commonsware的答案我已经能够运行原始SQL语句来在数据库创建期间创建视图.

 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();
Run Code Online (Sandbox Code Playgroud)

VIEW实际上是在SQLite数据库上创建的并且工作正常,但我不能在我的Dao的@Query中引用它,因为我得到一个编译时错误:

错误:(100,48)错误:查询有问题:[SQLITE_ERROR] SQL错误或缺少数据库(没有这样的表:view_name)

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

Fra*_*sco 6

更新17/12/2018

Room persistence库的2.1.0及更高版本现在支持SQLite数据库视图:https: //developer.android.com/training/data-storage/room/creating-views (参见DD的评论)

更新15/12/2017

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

问题在于视图中显然不存在的Entity主键,因此迁移无效.

请参阅CommonsWare对可能的hacky解决方法的评论.

原始答案

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

无论如何,我已经使用一种解决方法完成了它:我创建了一个与视图具有相同名称和列的实体(只有名称实际上是必需的),这将在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();
Run Code Online (Sandbox Code Playgroud)