Android如何操作数据库,有哪些方法?
- 云服务器
- 2026-07-25
- 6
使用 SQLiteOpenHelper 管理数据库
Android 内置 SQLite 数据库,通过 SQLiteOpenHelper 可方便地创建、升级数据库并执行操作,基本步骤:
- 创建子类:继承 SQLiteOpenHelper,实现 onCreate() 和 onUpgrade()。
- 获取实例:通过构造方法指定数据库名称和版本号。
- 获取读写对象:getWritableDatabase() 或 getReadableDatabase() 返回 SQLiteDatabase 对象。
- 执行 SQL:使用 execSQL() 执行 DDL,rawQuery() 执行查询,或使用 insert()、update()、delete() 等便捷方法。
| 方法 | 说明 |
|---|---|
| onCreate(db) | 首次创建数据库时调用,执行建表语句 |
| onUpgrade(db, oldVersion, newVersion) | 数据库版本升级时调用,处理表结构变更 |
示例片段:

public class MyDBHelper extends SQLiteOpenHelper { private static final String DB_NAME = "mydb.db"; private static final int DB_VERSION = 1; public MyDBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE user (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS user"); onCreate(db); } }
使用 Room 持久化库
Room 是 Google 推荐的 ORM 框架,简化数据库操作,编译时验证 SQL,减少样板代码。
核心组件:
- Entity:数据实体类,对应数据库表,用 @Entity 标注。
- DAO:数据访问对象,定义操作接口,用 @Dao 标注。
- Database:数据库类,继承 RoomDatabase,用 @Database 标注。
使用步骤:

- 添加依赖(build.gradle): implementation "androidx.room:room-runtime:2.6.1" annotationProcessor "androidx.room:room-compiler:2.6.1" // Java
- 定义 Entity: @Entity public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; public int age; }
- 定义 DAO: @Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM user") List<User> getAll(); @Delete void delete(User user); }
- 创建 Database: @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
- 获取实例并操作: AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "room_db").build(); UserDao dao = db.userDao(); dao.insert(new User("Alice", 25));
常见操作对比
| 操作 | SQLiteOpenHelper | Room |
|---|---|---|
| 插入 | db.insert("user", null, values) | @Insert 注解方法 |
| 查询 | db.rawQuery("SELECT FROM user", null) | @Query 注解方法 |
| 更新 | db.update("user", values, "id=?", new String[]{id}) | @Update 注解方法 |
| 删除 | db.delete("user", "id=?", new String[]{id}) | @Delete 注解方法 |
| 异步 | 需手动处理线程 | 配合 LiveData / Flow 或协程 |
性能与注意事项
- 避免在主线程操作数据库(Room 默认禁止,需改写或使用异步)。
- 使用事务批量操作时提高效率:db.beginTransaction() / endTransaction()。
- 索引:对频繁查询的字段添加索引,提升速度。
- 版本升级:Room 通过 Migration 类安全迁移,避免数据丢失。
相关问题与解答
问题1:使用 Room 时,如何安全地升级数据库并保留原有数据?
解答:Room 通过 Migration 对象处理升级,定义 Migration 时指定起始版本和结束版本,并在 build() 时调用 addMigrations(),例如从版本 1 升级到 2 增加一列:

Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE user ADD COLUMN phone TEXT"); } }; db = Room.databaseBuilder(context, AppDatabase.class, "room_db") .addMigrations(MIGRATION_1_2) .build();
若未提供迁移,Room 会触发 fallbackToDestructiveMigration() 销毁重建数据,需谨慎使用。
问题2:SQLiteOpenHelper 中 getWritableDatabase() 和 getReadableDatabase() 有何区别?
解答:两者都返回 SQLiteDatabase 对象,但行为略有不同:
- getWritableDatabase():以读写模式打开数据库,如果磁盘满或发生错误会抛出异常,若数据库不可写,则返回只读数据库(但一般不推荐依赖此行为)。
- getReadableDatabase():优先尝试以读写模式打开,若失败则以只读模式打开(不会抛出异常),通常用于仅读取数据的场景,但仍建议根据实际需要选择合适的方法,避免误写操作。