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

安卓开发数据库保存到本地

安卓本地数据库存储方案选择

存储方式 适用场景 特点
SQLite 结构化数据存储(如用户信息、订单记录等) 轻量级关系型数据库,支持SQL语法,需手动管理数据库连接与操作
Room 需要类型安全的数据库访问,追求开发效率与可维护性 基于SQLite的抽象层,提供编译时校验,支持LiveData与RxJava
文件存储 非结构化数据(如图片、音频、配置文件等) 简单键值对存储,适合少量配置数据,SharedPreferences本质是XML文件存储
MMKV 高频读写的小型配置数据 腾讯开源的key-value存储方案,性能优于SharedPreferences

Room数据库实现步骤

添加依赖

// 在app/build.gradle中添加
dependencies {
    def room_version = "2.5.1"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version" // 如果使用Kotlin
}

定义实体类

// 使用@Entity注解标记表结构
@Entity(tableName = "user")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    @ColumnInfo(name = "username")
    public String username;
    @ColumnInfo(name = "password")
    public String password;
}

创建DAO接口

// 定义数据访问对象,包含增删改查方法
@Dao
public interface UserDao {
    @Insert
    void insertUser(User user);
    @Update
    void updateUser(User user);
    @Delete
    void deleteUser(User user);
    @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(
    getApplicationContext(),
    AppDatabase.class,
    "app-database"
).build();

SQLite直接操作示例

创建数据库帮助类

public class DBHelper extends SQLiteOpenHelper {
    private static final String CREATE_TABLE = 
        "CREATE TABLE IF NOT EXISTS user (" +
        "id INTEGER PRIMARY KEY AUTOINCREMENT," +
        "username TEXT," +
        "password TEXT)";
    public DBHelper(Context context) {
        super(context, "user.db", null, 1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS user");
        onCreate(db);
    }
}

执行CRUD操作

// 插入数据
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", "admin");
values.put("password", "123456");
db.insert("user", null, values);

数据迁移处理

当数据库版本升级时:

Room.databaseBuilder(context, AppDatabase.class, "app-database")
    .addMigrations(new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            // 添加新字段
            database.execSQL("ALTER TABLE user ADD COLUMN age INTEGER");
        }
    }).build();

最佳实践建议

场景 推荐方案 原因
复杂业务数据存储 Room + LiveData 类型安全、实时监听数据变化
简单配置存储 MMKV 高性能、支持多进程共享
大数据量文件存储 Room + 文件系统 结构化元数据存储在数据库,二进制文件单独存储
敏感数据保护 SQLCipher + Room 数据库全盘加密,防止数据泄露

相关问题与解答

Q1:Room相比直接使用SQLite的优势是什么?
A1:Room提供以下核心优势:

  1. 类型安全:编译时检查SQL语句正确性
  2. 简化开发:自动生成数据库操作代码,减少模板代码
  3. 活跃感知:通过LiveData实现数据库变更监听
  4. RxJava支持:原生支持响应式编程

Q2:如何处理多线程并发访问数据库的问题?
A2:解决方案包括:

  1. 允许主线程查询RoomDatabase.setQueryExecutionCallback()配置
  2. 异步操作:使用AsyncTaskExecutorService处理写入操作
  3. 事务管理:通过@Transaction注解保证原子性操作
  4. 线程隔离:结合LiveData在后台线程执行数据库操作,UI线程观察结果