上一篇
安卓开发创建数据表
- 行业动态
- 2025-04-22
- 4
安卓数据存储方式
安卓开发中常见的数据存储方式包括:
- SQLite:轻量级关系型数据库,适合结构化数据存储。
- Room:基于SQLite的抽象层,提供更简洁的API和编译时校验。
- ContentProvider:跨应用数据共享机制,通常结合SQLite使用。
- 第三方库(如GreenDAO):简化数据库操作,但需引入依赖。
使用SQLite创建数据表
创建数据库帮助类
继承 SQLiteOpenHelper
,重写 onCreate()
和 onUpgrade()
方法:
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建数据表 String sql = "CREATE TABLE user (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT NOT NULL," + "age INTEGER DEFAULT 0)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级处理(如删除旧表) db.execSQL("DROP TABLE IF EXISTS user"); onCreate(db); } }
获取数据库实例并操作
// 初始化数据库帮助类 MyDatabaseHelper dbHelper = new MyDatabaseHelper(context); // 获取可写数据库 SQLiteDatabase db = dbHelper.getWritableDatabase(); // 插入数据 ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 25); db.insert("user", null, values);
使用Room创建数据表
定义实体类
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT) public String name; @ColumnInfo(name = "age", defaultValue = "0") public int age; }
创建数据库类
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
定义数据访问对象(Dao)
@Dao public interface UserDao { @Insert void insert(User... users); @Query("SELECT FROM user WHERE id = :userId") User getUserById(int userId); }
使用数据库
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db").build(); UserDao userDao = db.userDao(); userDao.insert(new User(0, "李四", 30));
数据库版本管理
方式 | SQLite | Room |
---|---|---|
版本定义 | 在 SQLiteOpenHelper 中指定 |
在 @Database 注解中定义 |
迁移策略 | 手动处理 onUpgrade() |
使用 Migration 或 AutoMigration |
回滚策略 | 需手动实现 | 内置支持 |
数据表结构设计示例
字段名 | 数据类型 | 说明 |
---|---|---|
id | INTEGER | 主键,自增 |
name | TEXT | 用户名,非空 |
age | INTEGER | 年龄,默认值为0 |
created_at | TIMESTAMP | 创建时间(可选字段) |
注意事项
- 线程安全:SQLite 数据库操作需在子线程执行,避免阻塞主线程。
- 迁移兼容性:升级数据库版本时,需妥善处理数据迁移(如添加新字段)。
- Room限制:Room暂不支持多进程写入同一数据库,需避免并发冲突。
相关问题与解答
问题1:如何实现SQLite数据库的自动版本迁移?
解答:
在 SQLiteOpenHelper
的 onUpgrade()
方法中,根据新旧版本差异执行迁移逻辑。
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { // 添加新字段 db.execSQL("ALTER TABLE user ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP"); } }
问题2:Room相比SQLite的优势是什么?
解答:
- 编译时校验:Room通过注解生成代码,避免运行时错误。
- 简化API:提供流畅接口(Flowable)和LiveData支持,便于响应式编程。
- 类型安全:实体类直接映射为对象,减少手动