上一篇
安卓开发数据库交互
- 行业动态
- 2025-04-22
- 5
安卓数据库交互基础
安卓开发中常用的数据库包括 SQLite(轻量级关系型数据库)和 Room(基于SQLite的ORM框架),以下是两者的核心特点对比:
特性 | SQLite | Room |
---|---|---|
操作方式 | 原生API,需手写SQL语句 | 通过注解生成代码,面向对象操作 |
编译时检查 | 无 | 支持(如字段类型匹配) |
性能优化 | 需手动管理 | 内置预编译语句、异步操作支持 |
最佳适用场景 | 简单数据存储、快速原型开发 | 复杂数据结构、多表关联、团队协作 |
SQLite数据库操作步骤
创建/打开数据库
SQLiteOpenHelper helper = new SQLiteOpenHelper(context, "db_name", null, version) { @Override public void onCreate(SQLiteDatabase db) { // 创建表:CREATE TABLE... } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级表结构:ALTER TABLE... } }; SQLiteDatabase db = helper.getWritableDatabase();
增删改查操作
- 插入数据
ContentValues values = new ContentValues(); values.put("column1", "value1"); db.insert("table_name", null, values);
- 查询数据
Cursor cursor = db.query("table_name", columns, "condition", args, null, null, null); // 遍历cursor读取数据
- 更新数据
ContentValues values = new ContentValues(); values.put("column1", "new_value"); db.update("table_name", values, "condition", args);
- 删除数据
db.delete("table_name", "condition", args);
- 插入数据
关闭数据库
db.close();
Room框架使用指南
定义实体类
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerateId = true) public int id; @ColumnInfo(name = "name") public String name; // 其他字段... }
创建DAO接口
@Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM user WHERE id = :userId") User getUserById(int userId); @Update void update(User user); @Delete void delete(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(); UserDao userDao = db.userDao(); userDao.insert(new User(0, "Alice")); // 插入数据
ContentProvider数据共享
- 作用:跨应用或跨进程共享数据(如联系人、文件等)。
- 核心方法:
query()
:读取数据insert()
:添加数据update()
:修改数据delete()
:删除数据
- 示例:调用系统通讯录
Uri uri = Uri.parse("content://contacts/people"); ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, null); // 处理查询结果
性能优化建议
问题 | 解决方案 |
---|---|
主线程操作数据库卡顿 | 使用 AsyncTask 、Thread 或 Room 的 RxJava /LiveData 异步处理 |
数据库文件过大 | 按需分表、定期清理无用数据 |
频繁读写冲突 | 使用事务(beginTransaction() )批量操作 |
问题与解答
问题1:Room相比SQLite的优势是什么?
解答:
- 编译时验证:Room在编译阶段检查SQL语句和字段类型,避免运行时错误。
- 抽象层级:通过DAO接口和实体类隐藏SQL细节,代码更简洁。
- 内置功能:支持LiveData实时监听、RxJava异步流,简化开发流程。
问题2:如何在多线程中安全操作数据库?
解答:
- SQLite:使用
synchronized
关键字或SQLiteDatabase.yieldIfCongested()
让出锁。 - Room:直接调用DAO方法(Room内部已处理线程安全),或配合
LiveData
/Flow
实现观察者模式