上一篇
安卓开发获取本地数据库
- 行业动态
- 2025-04-21
- 2753
安卓本地数据库类型
安卓开发中常用的本地数据库方案包括:
数据库类型 | 特点 | 适用场景 |
---|---|---|
SQLite | 轻量级嵌入式数据库,支持SQL语法 | 简单数据存储,快速开发 |
Room | 基于SQLite的抽象层,提供编译时校验 | 复杂数据关系,需要类型安全的场景 |
其他 | Realm、GreenDao等ORM框架 | 高性能要求或特殊需求场景 |
SQLite数据库操作
创建数据库帮助类
public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app_data.db"; private static final int VERSION = 1; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建用户表 db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级处理 db.execSQL("DROP TABLE IF EXISTS user"); onCreate(db); } }
获取可读写数据库实例
DatabaseHelper helper = new DatabaseHelper(context); SQLiteDatabase db = helper.getWritableDatabase(); // 获取可写数据库 // 或使用 getReadableDatabase() 获取只读数据库
执行基础CRUD操作
// 插入数据 ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 25); db.insert("user", null, values); // 查询数据 Cursor cursor = db.query("user", null, "age > ?", new String[]{"20"}, null, null, null); while(cursor.moveToNext()){ int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); // 处理数据... } cursor.close(); // 更新数据 ContentValues updateValues = new ContentValues(); updateValues.put("age", 26); db.update("user", updateValues, "name = ?", new String[]{"张三"}); // 删除数据 db.delete("user", "age < ?", new String[]{"20"});
Room数据库操作
添加依赖
// build.gradle dependencies { implementation "androidx.room:room-runtime:2.5.1" kapt "androidx.room:room-compiler:2.5.1" // 如果使用Kotlin }
定义实体类
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; @ColumnInfo(name = "age") public int age; }
创建DAO接口
@Dao public interface UserDao { @Insert void insertUser(User... users); @Query("SELECT FROM user WHERE age > :minAge") List<User> getUsersByAge(int minAge); @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_data.db").build(); UserDao userDao = db.userDao();
数据库操作注意事项
- 线程管理:数据库操作需在子线程执行,主线程操作会抛出异常
- 版本迁移:升级数据库版本时需实现
onUpgrade()
方法处理数据迁移 - 内存管理:及时关闭Cursor对象,避免内存泄漏
- 数据加密:如需保护数据,可使用SQLCipher等加密库
相关问题与解答
Q1:SQLite和Room应该如何选择?
A:
- 选择SQLite:适合简单数据存储,需要直接使用SQL语句的场景,学习成本较低
- 选择Room:适合复杂数据关系,需要编译时校验,追求类型安全和开发效率的场景,支持LiveData等高级特性
- 推荐新项目优先使用Room,存量项目可逐步迁移
Q2:如何处理数据库版本升级?
A:
- 在
onUpgrade()
方法中编写迁移逻辑 - 使用
migration
策略(Room特有):Room.databaseBuilder(context, AppDatabase.class, "app_data.db") .addMigrations(MIGRATION_1_2) // 添加迁移脚本 .build();
- 重要原则:
- 保持向前兼容(新版本能处理旧数据)
- 避免删除用户已有数据字段
- 测试所有迁移路径