安卓室。哪种插入方法会更快?

Sus*_*ger 5 sqlite android sql-insert android-room android-architecture-components

我使用 Room 作为 SQLite 上的抽象层。阅读此页面后,我发现我们可以同时插入多个对象。目前我使用 For 循环来插入对象,即在每个 For 循环迭代中插入一个对象。我目前知道的两种插入方式是:

  1. 使用 For 循环并一次插入一个对象

    @Insert(onConflict = OnConflictStrategy.REPLACE) public void addActivity(Person person);

  2. 插入数组或对象列表。

    @Insert(onConflict = OnConflictStrategy.REPLACE) public void insertUsers(Person ... people);

我在编写插入对象的代码时,不知道第二种插入方式。现在我想知道这两种方式之间的速度是否有明显差异,以便我可以更改代码以提高应用程序的性能。

Ben*_*fez 8

正如 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 次......性能是可怕)。