安卓开发中常用的数据库方案包括:
| 方案 | 特点 |
|—————|———————————————————————-|
| SQLite | 轻量级嵌入式数据库,安卓原生支持,适合小型数据存储,需手动管理线程。 |
| Room(Jetpack)| 基于SQLite的抽象层,提供编译时校验、流畅API,支持LiveData和RxJava。 |
| 其他(如Realm)| 第三方库,性能优化较好,但需额外集成。 |
创建数据库
通过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")); }
核心组件
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; }
@Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM user WHERE id = :id") User getUserById(int id); }
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
线程安全与异步操作
Room默认禁止在主线程执行操作,可通过以下方式处理:
操作类型 | 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() |
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db").build();
UserDao userDao = db.userDao();
// 插入数据(需在子线程) userDao.insert(new User());
AsyncTask
或ViewModel
+LiveData
。onUpgrade()
方法(SQLite)或Migration
类(Room)。db.beginTransaction()
)。解答:
解答:
定义关联实体:使用@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
保证多表查询的原子