房间持久性库 - 创建视图

时间:2017-09-27 16:21:58

标签: android-room

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

使用Commonsware的答案here我已经能够在数据库创建期间运行原始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();

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

  

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

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

1 个答案:

答案 0 :(得分:6)

更新17/12/2018

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

更新15/12/2017

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

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

请参阅CommonsWare's comment了解可能的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();