数据库类型 | 特点 | 适用场景 |
---|---|---|
SQLite | 轻量级嵌入式数据库,Android内置支持 | 本地数据存储,结构化数据管理 |
Room | 基于SQLite的抽象层,提供编译时验证 | 复杂数据操作,避免SQL语法错误 |
Realm | 高性能对象数据库 | 需要实时数据同步的场景 |
创建数据库Helper类
public class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public DBHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建用户表 String sql = "CREATE TABLE user(id INTEGER PRIMARY KEY,name TEXT,email TEXT)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级处理 db.execSQL("ALTER TABLE user ADD COLUMN age INTEGER"); } }
数据操作示例
// 插入数据 SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name","张三"); values.put("email","zhangsan@example.com"); db.insert("user",null,values);
// 查询数据
Cursor cursor = db.query(“user”,null,”id=?”,new String[]{“1”},null,null,null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(“name”));
}
三、Room持久化库实现
1. 定义实体类
```java
@Entity(tableName = "user")
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "name")
public String name;
@ColumnInfo(name = "email")
public String email;
}
创建DAO接口
@Dao public interface UserDao { @Insert void insertUser(User... users); @Query("SELECT FROM user WHERE id = :userId") User getUserById(int userId); }
配置数据库
@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(); User user = new User(); user.name = "李四"; db.userDao().insertUser(user);
特性 | SQLite | Room |
---|---|---|
编译时检查 | 无 | 支持(通过注解处理器) |
线程安全 | 需手动处理 | 自动处理(LiveData/RxJava) |
代码冗余 | 高(需手写SQL) | 低(面向对象操作) |
迁移支持 | 需手动实现 | 提供Migration API |
空数据处理 | 需判断Cursor是否为空 | 自动处理(返回空对象) |
解决方案:
getReadableDatabase()
/getWritableDatabase()
获取不同权限的数据库实例 withTransaction
方法解决方案:
onUpgrade()
方法编写迁移逻辑 Migration
类逐版本迁移: Room.migrationsDifferences(oldVersion, newVersion) // 自动生成迁移脚本