上一篇
安卓开发保存数据库
- 行业动态
- 2025-04-23
- 2334
安卓开发保存数据库可使用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观察数据变化,通过注解处理器生成实现类,避免手写重复代码。
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; }