嗨,我正在开发一个android应用程序,正在使用会议室DB,并且已经创建了一个表,现在我想添加另一个表,我需要为此编写一个迁移,在迁移中我需要编写完整的SQL查询新表假设我有20多个字段,查询将变得多么复杂。
在SQLite中,我们需要编写这样的复杂查询,有时编写和查找错误会变得很复杂。因此,空间数据库得以恢复,但现在我们需要在空间数据库迁移中执行相同的操作。那有什么用呢?
如果我们使用SQLite,则如果我们已经添加了一个表,现在又想添加另一个表,那么我们可以卸载应用程序,然后将生成新表,但是在室内DB中,这不是我尝试的情况同样的事情,但它仍然向我显示您需要为新表编写迁移。因此,在这种情况下,在开发过程中将有很多迁移脚本,这些脚本将来很难在某个时候维护。
那么在开发应用程序时我必须编写多个创建查询有什么用,这在任何应用程序中都是非常基本的流程。
一旦我们开始生产,那么为每个表写迁移是有意义的,但不是在开发模式下。
房间DB如何使开发人员的工作更轻松?
答案 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操作以及将数据包装在LiveData
或Observable
中的难易程度发挥了作用,而不是您没有需要编写迁移。