上一篇
安卓加载数据库数据
- 行业动态
- 2025-04-23
- 6
安卓加载数据库数据需通过SQLiteDatabase或Room接口执行查询,建议使用异步任务处理,获取结果集后及时关闭游标,确保主线程流畅
安卓加载数据库数据详解
本地数据库数据加载
SQLite 数据库操作
- 步骤:
- 通过
SQLiteOpenHelper
创建或升级数据库。 - 使用
SQLiteDatabase
对象执行查询(rawQuery
或execSQL
)。 - 将结果集
Cursor
转换为实体类列表。
- 通过
- 代码示例:
val db = helper.readableDatabase val cursor = db.query("table_name", null, null, null, null, null, null) val list = mutableListOf<Entity>() while (cursor.moveToNext()) { val item = Entity(cursor.getString(0), cursor.getInt(1)) list.add(item) } cursor.close()
- 缺点:需手动管理线程,易导致主线程阻塞。
- 步骤:
Room 持久化库
- 核心组件:
@Dao
:定义数据库操作方法。@Query
:支持复杂 SQL 查询。LiveData
:自动感知数据变化并通知 UI。
- 代码示例:
@Dao interface UserDao { @Query("SELECT FROM user") fun getAllUsers(): LiveData<List<User>> }
- 优势:编译时检查 SQL 正确性,支持 RxJava/协程。
- 核心组件:
网络数据库数据加载
远程 API 与本地数据库结合
- 流程:
- 通过 Retrofit/OkHttp 请求网络 API。
- 将数据存入 Room 数据库。
- UI 层直接监听
LiveData
数据变化。
- 代码示例(协程 + Room):
viewModelScope.launch { val apiResponse = retrofitService.getData() userDao.insertAll(apiResponse) }
- 流程:
缓存策略
- 方案:
| 场景 | 实现方式 | 适用性 |
|———————|———————————–|———————-|
| 短期缓存 |OkHttp
缓存 +Room
存储 | 频繁访问的数据 |
| 长期缓存 | 数据库 + 版本号控制 | 需持久化的数据 |
| 离线缓存 | 本地数据库 + 同步机制 | 无网络环境 |
- 方案:
性能优化策略
问题 | 解决方案 | 代码示例(Kotlin) |
---|---|---|
主线程卡顿 | 异步加载数据(协程/RxJava) | viewModelScope.launch { ... } |
内存泄漏 | 使用 ViewModel + LiveData |
val data: LiveData<List<T>> |
重复刷新 | 配合 NetworkBoundResource (WorkManager) |
自动处理网络与缓存切换 |
大数据集加载 | 分页查询(PagingSource ) |
Pager(config) { ... } |
常见问题与解答
问题1:数据加载过慢导致界面卡死
- 原因:主线程执行数据库查询或网络请求。
- 解决:
- 使用协程
withContext(Dispatchers.IO)
处理耗时操作。 - 分页加载数据(如
RecyclerView
的分页组件)。
- 使用协程
问题2:数据更新后 UI 不刷新
- 原因:未使用
LiveData
或未触发观察者回调。 - 解决:
- 确保数据库操作返回
LiveData
,update->postValue(newData)
。 - 检查
LifecycleOwner
是否活跃(如Activity
未销毁
- 确保数据库操作返回