Android:为什么Room这么慢?

原学程将引见Android:为何Room这么缓?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

Android:为什么Room这么慢? 教程 第1张

成绩描写

我正在应用Room在Kotlin中编辑1个简略的数据库进程,我没法说明为何该进程如斯迟缓,重要是在Android Studio模仿器上。

我正在处置的表格是:

@Entity(tableName = "folders_items_table", indices = arrayOf(Index(value = ["folder_name"]), Index(value = ["item_id"])))
data class FoldersItems(
  @PrimaryKey(autoGenerate = true)
  var uid: Long = 0L,

  @ColumnInfo(name = "folder_name")
  var folder_name: String = "",

  @ColumnInfo(name = "item_id")
  var item_id: String = ""

)

我只是想如许做:检讨组开文件夹/项目能否曾经存留,拔出1个新记载。假如没有是,这便疏忽它。在模仿器上,拔出一00笔记录最多须要七⑻秒。在真实的装备上,它的速度要快患上多,但是依然须要年夜约三⑷秒,这关于只要一00笔记录的人去说是弗成接收的。瞅起去拔出盘问特殊缓。

上面是完成我适才描写的进程(在协程中):

val vsmFoldersItems = FoldersItems()

items.forEach{

 val itmCk = database.checkFolderItem(item.folder_name, it)


 if (itmCk == 0L) {


  val newFolderItemHere = vsmFoldersItems.copy(
  folder_name = item.folder_name,
  item_id = it
  )
 
  database.insertFolderItems(newFolderItemHere)

 }
 
}

变质&Quot;Items&Quot;是字符串数组。

以下是上述挪用函数的DAO界说:

@Query("SELECT uid FROM folders_items_table WHERE folder_name = :folder AND item_id = :item")
 fun checkFolderItem(folder: String, item: String): Long

@Insert
 suspend fun insertFolderItems(item: FoldersItems)

推举谜底

将轮回搁在单个工作中应可明显削减所用时光。

缘由是每一个工作(默许情形下,对于数据库停止变动的每一个SQL语句)皆将招致磁盘写进。这便是您的轮回的一00次磁盘写进。

假如在轮回之前开端工作,而后在轮回完成时将工作树立为胜利,而后停止工作,则须要停止1次磁盘写进。

我没有肯定的是,在应用挂起的函数(对于Kotlin没有是很熟习)时,怎样精确天履行此操纵。

是以,我修议增除挂起或者在轮回中应用另外一个DAO。

而后像如许:-

val vsmFoldersItems = FoldersItems()
your_RoomDatabase.beginTransaction()
items.forEach{

 val itmCk = database.checkFolderItem(item.folder_name, it)


 if (itmCk == 0L) {


  val newFolderItemHere = vsmFoldersItems.copy(
  folder_name = item.folder_name,
  item_id = it
  )
 
  database.insertFolderItems(newFolderItemHere)

 }
 
}
your_RoomDatabase.setTransactionSuccessful() //<<<<<<< IF NOT set then ALL updates will be rolled back
your_RoomDatabase.endTransaction()

您不妨参照:-

    https://developer.android.com/reference/androidx/room/RoomDatabase

您能够须要特殊参照runInTransaction

佳了闭于Android:为何Room这么缓?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。