安卓创建数据库需引入Room库,定义实体类,创建DAO接口,继承RoomDatabase并调用build()构建
Android数据库类型选择
数据库类型 |
适用场景 |
特点 |
SQLite |
轻量级本地存储 |
关系型数据库,支持SQL语法,适合结构化数据 |
Room |
现代化数据库访问层 |
基于SQLite,提供抽象层,编译时验证,支持LiveData |
Realm |
高性能本地数据库 |
面向对象数据库,适合复杂数据结构(需引入第三方库) |
SQLite数据库创建与使用
创建数据库帮助类
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) {
// 创建表结构
String sql = "CREATE TABLE user(id INTEGER PRIMARY KEY,name TEXT)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 数据库升级处理
db.execSQL("DROP TABLE IF EXISTS user");
onCreate(db);
}
}
数据库操作方法
操作类型 |
实现方式 |
示例代码 |
插入数据 |
insert() |
db.insert("user", null, contentValues) |
更新数据 |
update() |
db.update("user", cv, "id=?", new String[]{id}) |
删除数据 |
delete() |
db.delete("user", "id=?", new String[]{id}) |
查询数据 |
query() |
db.query("user", null, "id=?", args, null, null, null) |
使用注意事项
- 线程安全:数据库操作必须在子线程执行
- 版本管理:升级VERSION时需处理数据迁移
- 资源释放:使用完毕后调用
db.close()
Room持久化库使用
定义实体类
@Entity(tableName = "user")
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "name")
public String name;
}
创建DAO接口
@Dao
public interface UserDao {
@Insert
void insertUser(User... users);
@Query("SELECT FROM user WHERE id = :userId")
User getUserById(int userId);
@Update
void updateUser(User user);
@Delete
void deleteUser(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();
User user = new User();
db.userDao().insertUser(user);
数据库操作对比表
特性 |
SQLite |
Room |
编译时检查 |
无 |
支持 |
接口复杂度 |
需要手写SQL |
面向对象操作 |
线程管理 |
需自行处理 |
支持RxJava/LiveData |
迁移支持 |
手动实现 |
内置MigrationStrategy |
空数据处理 |
需判断Cursor是否为空 |
返回Optional/LiveData |
常见问题与解决方案
数据库文件存储位置
存储方式 |
路径格式 |
特点 |
内部存储 |
/data/data/包名/databases/ |
无需申请权限,自动备份 |
外部存储 |
/storage/emulated/0/ |
需要运行时权限,可共享数据 |
数据库加密方案
方案 |
实现方式 |
安全性等级 |
SQLCipher |
集成加密库 |
中等(AES加密) |
Android Keystore |
系统密钥存储 |
高(硬件级密钥保护) |
自定义加密 |
结合AES+密钥管理 |
依赖实现质量 |
相关问题解答
Q1:SQLite和Room应该如何选择?

- SQLite:适合简单项目或需要完全控制SQL的场景,学习曲线平缓
- Room:推荐新项目使用,优势包括编译时验证、类型安全、内置架构迁移支持,特别适合MVVM架构
Q2:如何处理多线程并发访问数据库?
- Room方案:使用
allowMainThreadQueries()
(仅限调试)、AsyncTask
、LiveData
或RxJava
处理异步操作
- SQLite方案:使用
ContentProvider
封装访问,或配合ThreadPoolExecutor
进行线程管理