Room DB升级需要编写完整插入查询

时间:2019-10-10 07:38:59

标签: android android-sqlite android-room android-database database-update

嗨,我正在开发一个android应用程序,正在使用会议室DB,并且已经创建了一个表,现在我想添加另一个表,我需要为此编写一个迁移,在迁移中我需要编写完整的SQL查询新表假设我有20多个字段,查询将变得多么复杂。

在SQLite中,我们需要编写这样的复杂查询,有时编写和查找错误会变得很复杂。因此,空间数据库得以恢复,但现在我们需要在空间数据库迁移中执行相同的操作。那有什么用呢?

如果我们使用SQLite,则如果我们已经添加了一个表,现在又想添加另一个表,那么我们可以卸载应用程序,然后将生成新表,但是在室内DB中,这不是我尝试的情况同样的事情,但它仍然向我显示您需要为新表编写迁移。因此,在这种情况下,在开发过程中将有很多迁移脚本,这些脚本将来很难在某个时候维护。

那么在开发应用程序时我必须编写多个创建查询有什么用,这在任何应用程序中都是非常基本的流程。

一旦我们开始生产,那么为每个表写迁移是有意义的,但不是在开发模式下。

房间DB如何使开发人员的工作更轻松?

3 个答案:

答案 0 :(得分:2)

  

我有20多个字段,查询的复杂程度。

当实体定义对象时,它可能非常简单,例如您的20列并获得20列就可以很简单

@Query(SELECT * FROM thetable)
List<Thetable> getAll();

上面在@Dao注释的接口中,您在代码中所做的全部工作是从内置房间数据库中检索实例,然后使用getAll方法返回Thetable对象列表。每个都有从数据库填充的所有成员变量。

例如你可能有:-

  mMyTheTableDaoObject = mMyBuiltRoomDatabase.getAll();
  List<TheTable> myTheTableList = mMyTheTableDaoObject.getAll();
  for(TheTable t: myTheTableList) {
     int current???? = t.get????();
  }

使用标准/非房间时,您将必须遵循以下原则:-

SQLitedatabase db = whatever_you_need_to_do_to_get_an_SQLiteDatabase_instance;
Cursor c = db.query("theTable",null,null,null,null,null,null);
ArrayList<TheTable> myTheTableList  = new ArrayList();
while(c.moveToNext()) {
    currentTheTable = new TheTable();
    current.TheTable.setId = c.getLong(c.getColumnIndex("id");
    current.TheTable.setNextColumn1 = c.getString("next_column1");
    current.TheTable.setNextColumn2 = c.getString("next_column2");
    ........ another 17 similar lines of code
    currentTheTable.setNextColumn20 = c.getString("next_column20"); 
    myTheTableList.add(currentTheTable);
}
for(TheTable t: myTheTableList) {
   int current???? = t.get????();
}
  

如果我们使用SQLite,则如果我们已经添加了一个表,现在又想添加另一个表,那么我们可以卸载应用程序,然后将生成新表,但是在室内DB中,这不是我尝试的情况同样的事情,但它仍然向我显示您需要为新表编写迁移。

     

一旦进入生产阶段,就应该为每个表编写迁移,但不是在开发模式下。

迁移后,只需删除数据库(删除应用程序的数据或卸载应用程序,然后将数据库存储在默认位置(数据/数据/ package_name /数据库)),然后重新运行而不更改版本。将根据新模式创建数据库。也许利用临时代码来相应地加载数据。

  

房间DB如何使开发人员的工作更轻松?

简而言之,ROOM可以从相对简单的代码中生成所谓的样板代码,例如上面的@Query会编写基础代码以提取数据并构建对象(例如上述代码)。

答案 1 :(得分:1)

请检查正式文件: https://developer.android.com/training/data-storage/room/migrating-db-versions

实际上是在后台使用 SQLITE 进行聊天室。它为您提供了许多其他设施。如果要进行迁移,则必须编写完整的代码才能创建表。

答案 2 :(得分:1)

苛刻您的问题在某种程度上是有效的,但是您知道android正在维护SQLite数据库和库,例如room,greendao甚至是本机SQLiteOpenHelper  正在为开发人员在后台使用sqllite处理交易。

在所有较早的库中,您也必须维护数据库的版本以及已将哪些字段或表添加到数据库中,并为数据库的版本升级编写迁移。

room的美丽之处在于,它们使SQLite数据库上的CRUD操作以及将数据包装在LiveDataObservable中的难易程度发挥了作用,而不是您没有需要编写迁移。