Android:为什么Room这么慢?
原学程将引见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这么缓?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。