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

安卓开发创建数据库

在Android中创建数据库通常使用SQLite,通过继承SQLiteOpenHelper类,重写onCreate()和onUpgrade()方法,执行SQL语句创建表结构,调用getWritableDatabase()获取 数据库实例,通过ContentValues或execSQL实现数据的增删改查操作

SQLite数据库创建与使用

创建数据库帮助类

public class DBHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "app.db"; // 数据库名称
    private static final int DATABASE_VERSION = 1; // 版本号
    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    // 创建表结构
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE user (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT," +
                "name TEXT NOT NULL," +
                "age INTEGER" +
                ")";
        db.execSQL(sql);
    }
    // 数据库升级处理
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS user"); // 简单重建策略
        onCreate(db);
    }
}

数据库操作方法

操作类型 关键代码 说明
插入数据 SQLiteDatabase db = helper.getWritableDatabase();<br>ContentValues values = new ContentValues();<br>values.put("name", "张三");<br>values.put("age", 25);<br>db.insert("user", null, values); 使用ContentValues构建参数
查询数据 Cursor cursor = db.query("user", null, "age > ?", new String[]{"20"}, null, null, "age DESC"); 条件查询并排序
更新数据 ContentValues values = new ContentValues();<br>values.put("age", 26);<br>db.update("user", values, "name = ?", new String[]{"张三"}); 根据条件更新
删除数据 db.delete("user", "age < ?", new String[]{"18"}); 删除指定记录

Room持久化库使用

定义实体类

@Entity(tableName = "user")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    @ColumnInfo(name = "name", typeAffinity = ColumnInfo.TYPE_TEXT)
    public String name;
    @ColumnInfo(name = "age", typeAffinity = ColumnInfo.TYPE_INTEGER)
    public int age;
}

创建DAO接口

@Dao
public interface UserDao {
    @Insert
    void insertUser(User... users); // 支持批量插入
    @Query("SELECT  FROM user WHERE age > :minAge")
    List<User> getUsersByAge(int minAge);
    @Update
    void updateUser(User user);
    @Delete
    void deleteUser(User user);
}

配置数据库

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

SQLite与Room对比

特性 SQLite Room
抽象层级 直接操作SQL语句 面向对象编程
编译检查 支持(通过注解校验)
线程安全 需手动处理 自动支持(LiveData等)
迁移管理 需手动实现 提供Migration API
性能优化 原始SQL执行 编译时生成优化代码

常见问题与解答

问题1:数据库版本升级时如何处理数据迁移?

解答

  1. SQLite方案

    • onUpgrade()方法中编写迁移逻辑
    • 示例:ALTER TABLE user ADD COLUMN email TEXT
    • 注意:直接修改表结构可能丢失数据
  2. Room方案

    • 创建迁移对象:
      static final Migration MIGRATION_1_2 = new Migration(1, 2) {
          @Override
          public void migrate(SupportSQLiteDatabase database) {
              database.execSQL("ALTER TABLE user ADD COLUMN email TEXT");
          }
      };
    • 在build时调用:Room.databaseBuilder(...).addMigrations(MIGRATION_1_2).build()

问题2:如何处理多表关联查询?

解答

  1. SQLite方案

    • 使用JOIN语句直接查询:
      SELECT a.name, b.department 
      FROM user a 
      JOIN department b ON a.dept_id = b.id
    • 注意:需要自己处理对象映射关系
  2. Room方案

    • 使用@Relation注解:

      @Entity(tableName = "orders")
      public class Order {
          @PrimaryKey(autoGenerate = true)
          public int id;
          public int userId;
      }
      @Entity(tableName = "users")
      public class User {
          @PrimaryKey(autoGenerate = true)
          public int id;
          public String name;
          @Relation(parentColumn = "id", entityColumn = "userId")
          public List<Order> orders;
      }
    • Room会自动处理嵌套对象的加载顺序