优化措施
- 使用事务:将批量插入操作放在一个事务中,这样可以减少数据库的提交次数,提高效率。因为每次单独插入都会有一次磁盘I/O操作和事务管理开销,而在一个事务中批量操作,只有事务结束时才进行一次提交,大大减少了I/O和事务管理的开销。
- 批量处理数据:避免逐条插入,而是将数据按一定数量分组,一次插入一组数据。减少数据库交互次数,从而减少通信开销。
- 异步执行:将插入操作放在异步线程中执行,避免阻塞主线程,保证应用的响应性。
代码示例
- 定义实体类和数据访问对象(DAO)
import androidx.room.Entity
import androidx.room.PrimaryKey
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Database
import androidx.room.RoomDatabase
import kotlinx.coroutines.flow.Flow
// 定义实体类
@Entity
data class User(
@PrimaryKey val id: Int,
val name: String
)
// 定义DAO
@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll(users: List<User>)
}
// 定义数据库
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
- 批量插入数据(使用事务)
import android.content.Context
import androidx.room.Room
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class UserRepository(private val context: Context) {
private val appDatabase: AppDatabase by lazy {
Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"user_database"
).build()
}
private val userDao = appDatabase.userDao()
fun insertUsers(users: List<User>) {
CoroutineScope(Dispatchers.IO).launch {
appDatabase.runInTransaction {
userDao.insertAll(users)
}
}
}
}
- 使用示例
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val userRepository = UserRepository(this)
val userList = listOf(
User(1, "Alice"),
User(2, "Bob"),
User(3, "Charlie")
)
userRepository.insertUsers(userList)
}
}