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

安卓开发获取本地数据库

安卓本地数据库类型

安卓开发中常用的本地数据库方案包括:

安卓开发获取本地数据库  第1张

数据库类型 特点 适用场景
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();

数据库操作注意事项

  1. 线程管理:数据库操作需在子线程执行,主线程操作会抛出异常
  2. 版本迁移:升级数据库版本时需实现onUpgrade()方法处理数据迁移
  3. 内存管理:及时关闭Cursor对象,避免内存泄漏
  4. 数据加密:如需保护数据,可使用SQLCipher等加密库

相关问题与解答

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

A

  • 选择SQLite:适合简单数据存储,需要直接使用SQL语句的场景,学习成本较低
  • 选择Room:适合复杂数据关系,需要编译时校验,追求类型安全和开发效率的场景,支持LiveData等高级特性
  • 推荐新项目优先使用Room,存量项目可逐步迁移

Q2:如何处理数据库版本升级?

A

  1. onUpgrade()方法中编写迁移逻辑
  2. 使用migration策略(Room特有):
    Room.databaseBuilder(context, AppDatabase.class, "app_data.db")
     .addMigrations(MIGRATION_1_2) // 添加迁移脚本
     .build();
  3. 重要原则:
    • 保持向前兼容(新版本能处理旧数据)
    • 避免删除用户已有数据字段
    • 测试所有迁移路径
0