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

安卓开发怎么建立数据库

使用SQLiteOpenHelper创建数据库,定义表结构,通过ContentValues增删改查,或用Room库简化

安卓数据库选型

数据库类型 特点 适用场景
SQLite 轻量级嵌入式数据库,Android内置支持 本地数据存储,结构化数据管理
Room 基于SQLite的抽象层,提供编译时验证 复杂数据操作,避免SQL语法错误
Realm 高性能对象数据库 需要实时数据同步的场景

SQLite实现步骤

  1. 创建数据库Helper类

    public class DBHelper extends SQLiteOpenHelper {
     private static final String DATABASE_NAME = "app.db";
     private static final int VERSION = 1;
     public DBHelper(Context context) {
         super(context, DATABASE_NAME, null, VERSION);
     }
     @Override
     public void onCreate(SQLiteDatabase db) {
         // 创建用户表
         String sql = "CREATE TABLE user(id INTEGER PRIMARY KEY,name TEXT,email TEXT)";
         db.execSQL(sql);
     }
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         // 数据库升级处理
         db.execSQL("ALTER TABLE user ADD COLUMN age INTEGER");
     }
    }
  2. 数据操作示例

    // 插入数据
    SQLiteDatabase db = helper.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("name","张三");
    values.put("email","zhangsan@example.com");
    db.insert("user",null,values);

// 查询数据
Cursor cursor = db.query(“user”,null,”id=?”,new String[]{“1”},null,null,null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(“name”));
}

安卓开发怎么建立数据库


 三、Room持久化库实现
1. 定义实体类
```java
@Entity(tableName = "user")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    @ColumnInfo(name = "name")
    public String name;
    @ColumnInfo(name = "email")
    public String email;
}
  1. 创建DAO接口

    @Dao
    public interface UserDao {
     @Insert
     void insertUser(User... users);
     @Query("SELECT  FROM user WHERE id = :userId")
     User getUserById(int userId);
    }
  2. 配置数据库

    @Database(entities = {User.class},version = 1)
    public abstract class AppDatabase extends RoomDatabase {
     public abstract UserDao userDao();
    }
  3. 使用数据库

    安卓开发怎么建立数据库

    AppDatabase db = Room.databaseBuilder(context,AppDatabase.class,"app.db").build();
    User user = new User();
    user.name = "李四";
    db.userDao().insertUser(user);

关键差异对比表

特性 SQLite Room
编译时检查 支持(通过注解处理器)
线程安全 需手动处理 自动处理(LiveData/RxJava)
代码冗余 高(需手写SQL) 低(面向对象操作)
迁移支持 需手动实现 提供Migration API
空数据处理 需判断Cursor是否为空 自动处理(返回空对象)

常见问题与解决方案

数据库并发访问导致崩溃

解决方案

  • SQLite使用getReadableDatabase()/getWritableDatabase()获取不同权限的数据库实例
  • Room默认支持多线程访问,复杂场景可使用withTransaction方法

数据库版本升级数据丢失

解决方案

  • SQLite需在onUpgrade()方法编写迁移逻辑
  • Room推荐使用Migration类逐版本迁移:
    Room.migrationsDifferences(oldVersion, newVersion) // 自动生成迁移脚本