上一篇
安卓应用开发数据库
- 行业动态
- 2025-04-22
- 7
安卓应用开发数据库详解
数据库选型
安卓开发中常用的数据库方案包括:
| 方案 | 特点 |
|—————|———————————————————————-|
| SQLite | 轻量级嵌入式数据库,安卓原生支持,适合小型数据存储,需手动管理线程。 |
| Room(Jetpack)| 基于SQLite的抽象层,提供编译时校验、流畅API,支持LiveData和RxJava。 |
| 其他(如Realm)| 第三方库,性能优化较好,但需额外集成。 |
SQLite基础
创建数据库
通过SQLiteOpenHelper
管理数据库版本和创建表:public class DBHelper extends SQLiteOpenHelper { private static final String CREATE_TABLE = "CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)"; public DBHelper(Context context) { super(context, "app.db", null, 1); // 数据库名称和版本号 } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); // 创建表 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 处理数据库升级逻辑 } }
CRUD操作
- 插入数据:
ContentValues values = new ContentValues(); values.put("name", "Alice"); db.insert("user", null, values);
- 查询数据:
Cursor cursor = db.query("user", null, "id=?", new String[]{"1"}, null, null, null); if (cursor.moveToFirst()) { String name = cursor.getString(cursor.getColumnIndex("name")); }
- 插入数据:
Room框架
核心组件
- Entity(实体类):映射数据库表。
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; }
- DAO(数据访问对象):定义数据库操作接口。
@Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM user WHERE id = :id") User getUserById(int id); }
- Database:封装数据库实例。
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
- Entity(实体类):映射数据库表。
线程安全与异步操作
Room默认禁止在主线程执行操作,可通过以下方式处理:- ExecutorService:手动管理线程。
- LiveData:观察数据变化并自动切换线程。
- RxJava:支持响应式编程(需添加依赖)。
数据访问对象(DAO)操作示例
操作类型 | SQLite实现 | Room实现(DAO接口) |
---|---|---|
插入 | SQLiteDatabase.insert() |
@Insert void insert(User user) |
更新 | SQLiteDatabase.update() |
@Update void update(User user) |
删除 | SQLiteDatabase.delete() |
@Delete void delete(User user) |
查询 | SQLiteDatabase.query() |
@Query("SELECT FROM user") List<User> getAll() |
数据库操作流程
- 初始化Room数据库:
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db").build();
- 获取DAO实例:
UserDao userDao = db.userDao();
- 执行CRUD操作:
// 插入数据(需在子线程) userDao.insert(new User());
注意事项
- 线程管理:
- SQLite操作需避免在主线程执行,否则可能抛出异常。
- Room强制要求异步操作,推荐使用
AsyncTask
或ViewModel
+LiveData
。
- 数据库迁移:
- 版本升级时需重写
onUpgrade()
方法(SQLite)或Migration
类(Room)。
- 版本升级时需重写
- 数据一致性:
- 使用事务保证多操作原子性(如
db.beginTransaction()
)。
- 使用事务保证多操作原子性(如
相关问题与解答
问题1:SQLite与Room的核心区别是什么?
解答:
- SQLite:需手动编写SQL语句,缺乏编译时校验,线程管理复杂。
- Room:提供面向对象的API,编译时校验SQL正确性,内置线程安全支持,适合复杂项目。
问题2:Room如何实现多表关联查询?
解答:
定义关联实体:使用
@Relation
注解。@Entity(tableName = "order") public class Order { @PrimaryKey(autoGenerate = true) public int id; public int userId; } @Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; } public class UserWithOrders { @Embedded public User user; @Relation(parentColumn = "id", entityColumn = "userId") public List<Order> orders; }
在DAO中定义查询:
@Transaction @Query("SELECT FROM user WHERE id = :userId") UserWithOrders getUserWithOrders(int userId);
@Transaction
保证多表查询的原子