当前位置:首页 > 行业动态 > 正文

安卓开发数据库使用

安卓数据库选型

数据库类型 适用场景 特点
SQLite 轻量级本地存储 嵌入式关系型数据库,无需额外配置,适合结构化数据存储
Room 复杂数据管理 基于SQLite的ORM框架,提供编译时校验,支持LiveData/Flow响应式编程
Realm 高性能需求 面向对象数据库(需引入第三方库),适合频繁读写场景
云数据库 跨设备同步 Firebase Firestore等,需网络支持,适合实时同步场景

SQLite基础用法

  1. 创建数据库帮助类

    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) {
         // 创建用户表
         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("ALTER TABLE user ADD COLUMN email TEXT");
     }
    }
  2. CRUD操作示例

    // 插入数据
    ContentValues values = new ContentValues();
    values.put("name", "张三");
    values.put("age", 25);
    getContentResolver().insert(Uri.parse("content://com.example.user"), values);

// 查询数据
Cursor cursor = db.query(“user”, null, “age > ?”, new String[]{“20”}, null, null, null);
while(cursor.moveToNext()){
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[]{“18”});


 三、Room持久库进阶
1. 实体定义
```java
@Entity(tableName = "user")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    @ColumnInfo(name = "name")
    public String name;
    @Ignore
    public int temp; // 不会被存储的字段
}
  1. DAO接口

    @Dao
    public interface UserDao {
     @Query("SELECT  FROM user WHERE age > :minAge")
     List<User> getUsersOlderThan(int minAge);
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     void insertAll(List<User> users);
     @Delete
     void deleteUser(User user);
     @Update
     void updateUser(User user);
    }
  2. 数据库构建

    @Database(entities = {User.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
     public abstract UserDao userDao();
     private static AppDatabase INSTANCE;
     public static AppDatabase getInstance(Context context) {
         if(INSTANCE == null){
             INSTANCE = Room.databaseBuilder(context, AppDatabase.class, "app.db")
                 .addMigrations(MIGRATION_1_2) // 添加迁移策略
                 .build();
         }
         return INSTANCE;
     }
     static final Migration MIGRATION_1_2 = new Migration(1, 2) {
         @Override
         public void migrate(SupportSQLiteDatabase database) {
             database.execSQL("ALTER TABLE user ADD COLUMN email TEXT");
         }
     };
    }

数据库迁移策略

迁移方式 适用场景 注意事项
显式迁移 少量结构变更 需手动处理数据转换
Migration类 多版本迭代 需保持迁移顺序
重建策略 重大结构变更 会清空所有数据

热迁移示例:

// 从版本1升级到版本2
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("CREATE TABLE user_temp (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");
        database.execSQL("INSERT INTO user_temp SELECT  FROM user");
        database.execSQL("DROP TABLE user");
        database.execSQL("ALTER TABLE user_temp RENAME TO user");
        database.execSQL("ALTER TABLE user ADD COLUMN email TEXT");
    }
};

问题与解答

Q1:SQLite与Room应该如何选择?

  • SQLite:适合简单数据存储,需要完全控制SQL语句的场景,需手动处理线程安全和编译错误。
  • Room:推荐用于复杂业务,提供类型安全的访问接口,自动生成SQL语句,内置LiveData支持数据观察,当项目需要处理多表关联、数据监听时优先选择Room。

Q2:如何保证数据库操作的线程安全?

  • Room方案:默认支持多线程访问,通过allowMainThreadQueries()允许主线程操作(仅限调试)
  • SQLite方案:需使用synchronized关键字或ContentProvider封装访问逻辑
  • 通用方案:重要操作应放在子线程执行,使用ExecutorService或Kotlin协程处理异步