上一篇
安卓开发获取数据库内的数据
- 行业动态
- 2025-04-22
- 3
使用SQLiteOpenHelper获取数据库数据
创建数据库帮助类
通过继承SQLiteOpenHelper
实现数据库创建与版本管理:
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表语句 db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级逻辑 } }
查询数据流程
步骤 | 说明 | 代码示例 |
---|---|---|
获取可读数据库 | 通过getReadableDatabase() 获取只读数据库实例 |
SQLiteDatabase db = helper.getReadableDatabase(); |
执行查询 | 使用rawQuery() 或query() 方法 |
Cursor cursor = db.query("users", null, null, null, null, null, null); |
解析结果 | 遍历Cursor获取数据 | while(cursor.moveToNext()){ String name = cursor.getString(1); } |
关闭资源 | 必须手动关闭Cursor和数据库 | cursor.close(); db.close(); |
使用Room持久化库获取数据
定义实体类
@Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; }
创建DAO接口
@Dao public interface UserDao { @Query("SELECT FROM users") LiveData<List<User>> getAllUsers(); // 支持观察者模式 @Insert(onConflict = OnConflictStrategy.REPLACE) void insertUser(User user); }
构建数据库对象
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
获取数据示例
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class,"app.db").build(); LiveData<List<User>> users = db.userDao().getAllUsers(); users.observe(lifecycleOwner, new Observer<List<User>>() { @Override public void onChanged(List<User> users) { // 更新UI recyclerViewAdapter.submitList(users); } });
线程处理方案对比
方案 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
AsyncTask | 简单后台任务 | 快速实现 | 已过时,内存泄漏风险 |
RxJava | 复杂数据流 | 链式调用灵活 | 学习成本高 |
Kotlin Coroutines | 现代异步编程 | 语法简洁,轻量级 | 需要Kotlin支持 |
LiveData | 生命周期感知 | 自动更新UI | 仅支持观察数据变化 |
常见问题与解决方案
Q1:查询大量数据时应用卡顿怎么办?
A1:采用分页查询策略,
@Query("SELECT FROM users LIMIT :limit OFFSET :offset") List<User> getUsers(int limit, int offset);
配合PagingSource
实现渐进式加载。
Q2:如何实现数据库实时更新?
A2:使用LiveData
或Flowable
包装查询结果:
@Query("SELECT FROM users") LiveData<List<User>> getAllUsers(); // Room会自动处理生命周期感知和数据更新通知