上一篇
安卓建立数据库步骤
- 行业动态
- 2025-04-22
- 5
安卓建立数据库步骤详解
创建数据库辅助类(SQLiteOpenHelper)
在安卓中,通常通过继承 SQLiteOpenHelper
类来管理数据库的创建和版本更新,此类负责执行数据库的初始化(onCreate
)和升级(onUpgrade
)逻辑。
示例代码:
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app_data.db"; // 数据库名称 private static final int DATABASE_VERSION = 1; // 数据库版本 public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表语句 String createTable = "CREATE TABLE users (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "name TEXT, " + "age INTEGER)"; db.execSQL(createTable); // 执行建表语句 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级逻辑(如表结构变更) db.execSQL("DROP TABLE IF EXISTS users"); // 删除旧表 onCreate(db); // 重新创建新表 } }
定义数据模型类
数据模型类用于映射数据库表的字段,通常与数据库操作紧密结合。
示例代码:
public class User { private int id; private String name; private int age; // 构造方法、getter/setter 省略 }
数据库基本操作方法
通过 SQLiteDatabase
对象执行增删改查操作。
操作类型 | 方法示例 | 说明 |
---|---|---|
插入数据 | insert() |
添加新记录 |
查询数据 | query() |
检索符合条件的数据 |
更新数据 | update() |
修改现有记录 |
删除数据 | delete() |
移除记录 |
示例代码(插入数据):
SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "Alice"); values.put("age", 25); long rowId = db.insert("users", null, values); // 返回新插入行的ID
数据库版本管理
当数据库结构发生变化时(如新增字段),需更新 DATABASE_VERSION
并在 onUpgrade
方法中处理数据迁移。
版本升级流程:
- 增加
DATABASE_VERSION
值。 - 在
onUpgrade
中执行表结构变更或数据迁移逻辑。 - 测试升级后兼容性。
使用 ContentProvider(可选)
若需跨应用共享数据,可通过 ContentProvider
暴露数据库接口。
作用:
- 统一数据访问入口。
- 支持多进程数据共享。
- 提供Uri接口供其他应用调用。
使用 Room 持久化库(推荐)
Google 提供的 Room 库简化了数据库操作,支持编译时校验和流畅的API。
核心组件:
@Entity
:定义表结构。@Dao
:定义数据操作接口。Database
:继承RoomDatabase
并封装多个Dao。
示例代码:
// 定义实体类 @Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; public int age; } // 定义Dao接口 @Dao public interface UserDao { @Insert long insertUser(User user); @Query("SELECT FROM users WHERE id = :userId") User getUserById(int userId); } // 创建数据库 @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
对比表格:原生SQL vs Room库
特性 | 原生SQL | Room库 |
---|---|---|
代码安全性 | 易出错(字符串拼接) | 编译时校验 |
开发效率 | 低(需手动写SQL) | 高(注解生成代码) |
抽象层次 | 底层操作 | 面向对象API |
适用场景 | 简单需求 | 复杂业务、团队协作 |
相关问题与解答
问题1:如何安全地处理数据库版本升级?
解答:
- 在
onUpgrade
方法中,根据新旧版本差异执行迁移脚本(如ALTER TABLE
添加字段)。 - 若涉及复杂迁移,可拆分为多个版本(如从1→2→3),逐步执行变更。
- 使用第三方库(如
SQLDelight
)辅助生成迁移代码。
问题2:为什么推荐使用 Room 而非原生SQL?
解答:
- 减少错误:Room 通过注解生成代码,避免手写SQL的拼写或语法错误。
- 提高可读性:面向对象的API更符合开发习惯,降低学习成本。
- 编译时检查:提前发现数据库与实体类的不匹配问题。
- 支持LiveData:天然集成观察者模式,便于实现响应式编程