Sus*_*ger 5 sqlite android sql-insert android-room android-architecture-components
我使用 Room 作为 SQLite 上的抽象层。阅读此页面后,我发现我们可以同时插入多个对象。目前我使用 For 循环来插入对象,即在每个 For 循环迭代中插入一个对象。我目前知道的两种插入方式是:
使用 For 循环并一次插入一个对象
@Insert(onConflict = OnConflictStrategy.REPLACE)
public void addActivity(Person person);
插入数组或对象列表。
@Insert(onConflict = OnConflictStrategy.REPLACE)
public void insertUsers(Person ... people);
我在编写插入对象的代码时,不知道第二种插入方式。现在我想知道这两种方式之间的速度是否有明显差异,以便我可以更改代码以提高应用程序的性能。
正如 OP 在对他们的问题的评论中所要求的,这是(为了清楚起见,作为答案)我为检查性能所做的工作:
之前,一一插入对象:
@Dao
abstract class MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun insert(items: MyObject): Long
// ...
}
Run Code Online (Sandbox Code Playgroud)
同步代码:
val response = backend.downloadItems() // download from server
val items = response.getData() // this is a List<MyObject>
if (items != null) {
for (i in items) {
myDao.persist(s)
}
}
Run Code Online (Sandbox Code Playgroud)
这在华为 P10+ 上花了一分钟。
我把这个改成:
@Dao
abstract class MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun insert(items: Iterable<MyObject>)
// ...
}
Run Code Online (Sandbox Code Playgroud)
同步代码:
val response = backend.downloadItems() // download from server
val items = response.getData() // this is a List<MyObject>
response.getData()?.let { myDao.insert(it) }
Run Code Online (Sandbox Code Playgroud)
这花了不到一秒钟的时间。
这里的要点是专门使用Iterable<>的DAO的版本@Insert的方法,其中如通过所述@iDemigod,使用Iterable<>的版本EntityInsertionAdapter。
所述函数的主体在@iDemigod 的答案中,它对所有插入使用单个准备好的语句。
将 SQL 解析为语句的开销很大,并且使用语句为整个插入批次创建一个事务,这可以帮助解决其他问题(我LiveData<>在数据库上有一个 observable ,在插入过程中被通知了 12k 次......性能是可怕)。
| 归档时间: |
|
| 查看次数: |
2969 次 |
| 最近记录: |