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

安卓开发保存数据库

安卓开发保存数据库可使用SQLite,通过ContentValues或Room持久库实现数据存储

SQLite数据库操作

创建数据库帮助类

public class DBHelper extends SQLiteOpenHelper {
    private static final String NAME = "app.db";
    private static final int VERSION = 1;
    public DBHelper(Context context) {
        super(context, NAME, null, VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建用户表
        String sql = "CREATE TABLE user(" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT," +
                "name TEXT," +
                "age INTEGER)";
        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, cv);
更新数据 update() db.update("user", cv, "id=?", args);
删除数据 delete() db.delete("user", "id=?", args);
查询数据 query() Cursor cursor = db.query("user", null, null, null, null, null, null);
// 插入数据示例
ContentValues cv = new ContentValues();
cv.put("name", "张三");
cv.put("age", 25);
SQLiteDatabase db = helper.getWritableDatabase();
db.insert("user", null, cv);

Room持久化库使用

配置依赖

// build.gradle
dependencies {
    implementation "androidx.room:room-runtime:2.5.1"
    annotationProcessor "androidx.room:room-compiler:2.5.1"
}

定义实体类

@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 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();
    private static AppDatabase INSTANCE;
    public static AppDatabase getInstance(Context context) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context, AppDatabase.class, "app.db")
                    .fallbackToDestructiveMigration() // 迁移策略
                    .build();
        }
        return INSTANCE;
    }
}

存储方案对比

特性 SQLite原生 Room持久化库 SharedPreferences
数据结构 关系型数据库 关系型数据库 键值对存储
线程安全 需手动处理 自动处理 自动处理
编译检查 支持
使用复杂度 极低
适用场景 复杂业务数据 常规业务数据 简单配置存储

常见问题处理

数据库升级异常

// 版本号更新时保留数据
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
        db.execSQL("ALTER TABLE user ADD COLUMN gender INTEGER"); // 添加新列
    }
}

Room主线程操作异常

// 必须在异步线程执行数据库操作
new Thread(() -> {
    AppDatabase.getInstance(context).userDao().insertUser(new User());
}).start();

相关问题与解答

Q1:Room相比SQLite的优势有哪些?
A:主要优势包括:编译时验证SQL正确性、减少模板代码、自动生成异步执行接口、支持LiveData观察数据变化,通过注解处理器生成实现类,避免手写重复代码。

安卓开发保存数据库  第1张

Q2:如何处理多表关联查询?
A:在Room中可以通过@Relation注解实现多表关联查询。

@Entity
public class Order {
    @PrimaryKey(autoGenerate = true)
    public int id;
    public int userId;
}
@Entity
public class Product {
    @PrimaryKey(autoGenerate = true)
    public int id;
    public int orderId;
}
// 关联查询
@Transaction
@Query("SELECT  FROM Order")
public List<OrderWithProducts> getOrdersWithProducts();
public static class OrderWithProducts {
    @Embedded
    public Order order;
    @Relation(parentColumn = "id", entityColumn = "orderId")
    public List<Product> products;
}
0