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

安卓开发创建数据表

安卓数据存储方式

安卓开发中常见的数据存储方式包括:

  • SQLite:轻量级关系型数据库,适合结构化数据存储。
  • Room:基于SQLite的抽象层,提供更简洁的API和编译时校验。
  • ContentProvider:跨应用数据共享机制,通常结合SQLite使用。
  • 第三方库(如GreenDAO):简化数据库操作,但需引入依赖。

使用SQLite创建数据表

创建数据库帮助类

安卓开发创建数据表  第1张

继承 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() 使用 MigrationAutoMigration
回滚策略 需手动实现 内置支持

数据表结构设计示例

字段名 数据类型 说明
id INTEGER 主键,自增
name TEXT 用户名,非空
age INTEGER 年龄,默认值为0
created_at TIMESTAMP 创建时间(可选字段)

注意事项

  1. 线程安全:SQLite 数据库操作需在子线程执行,避免阻塞主线程。
  2. 迁移兼容性:升级数据库版本时,需妥善处理数据迁移(如添加新字段)。
  3. Room限制:Room暂不支持多进程写入同一数据库,需避免并发冲突。

相关问题与解答

问题1:如何实现SQLite数据库的自动版本迁移?

解答
SQLiteOpenHelperonUpgrade() 方法中,根据新旧版本差异执行迁移逻辑。

@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的优势是什么?

解答

  1. 编译时校验:Room通过注解生成代码,避免运行时错误。
  2. 简化API:提供流畅接口(Flowable)和LiveData支持,便于响应式编程。
  3. 类型安全:实体类直接映射为对象,减少手动
0