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

安卓建立数据库

使用SQLite建立数据库

SQLite是安卓原生支持的轻量级数据库,适合存储结构化数据。

创建数据库帮助类

通过继承SQLiteOpenHelper实现数据库创建和版本管理:

安卓建立数据库  第1张

public class DbHelper extends SQLiteOpenHelper {
    private static final String NAME = "app.db"; // 数据库名称
    private static final int VERSION = 1;        // 版本号
    public DbHelper(Context context) {
        super(context, NAME, null, VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表语句
        String sql = "CREATE TABLE user(id INTEGER PRIMARY KEY,name TEXT,age INTEGER)";
        db.execSQL(sql);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 数据库升级操作(如表结构变更)
        db.execSQL("ALTER TABLE user ADD COLUMN address TEXT");
    }
}

执行增删改查操作

// 插入数据
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 25);
getWritableDatabase().insert("user", null, values);
// 查询数据
Cursor cursor = getReadableDatabase().query("user", null, "age > ?", new String[]{"20"}, null, null, null);
while(cursor.moveToNext()){
    int id = cursor.getInt(cursor.getColumnIndex("id"));
    String name = cursor.getString(cursor.getColumnIndex("name"));
}
cursor.close();
方法 作用
insert() 插入数据
update() 更新数据
delete() 删除数据
query() 查询数据
execSQL() 执行SQL语句

使用Room持久化库

Room是谷歌推出的抽象层,提供编译时校验和流畅API。

定义实体类

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

创建DAO接口

@Dao
public interface UserDao {
    @Insert
    void insert(User... users);      // 插入多条数据
    @Query("SELECT  FROM user WHERE age > :minAge")
    List<User> getUsersByAge(int minAge);
    @Delete
    void delete(User user);
}

构建数据库对象

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}
注解 作用
@Entity 标记数据库表实体
@Dao 定义数据访问对象
@Query 自定义SQL查询
@Insert 生成插入语句
@Database 配置数据库信息

SQLite与Room对比

特性 SQLite Room
API复杂度 高(需手写SQL) 低(面向对象)
编译时校验 有(通过注解生成代码)
线程安全 需手动处理 自动支持(允许主线程访问)
LiveData支持 内置(可观察数据变化)
迁移工具 需手动实现 提供Migrations API

常见问题与解答

问题1:如何选择SQLite和Room?

解答

  • 简单项目或临时存储可选SQLite(无需引入依赖)
  • 复杂业务推荐Room(提供编译校验、LiveData集成、协程支持)
  • Room底层仍使用SQLite,性能无差异

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

解答

  1. SQLite:在onUpgrade()中执行ALTER TABLECREATE TABLE语句
  2. Room:通过Migration类逐版本迁移
    // Room迁移示例
    Room.migrations(database)
     .addMigrations(new Migration(1, 2) {
         @Override
         public void migrate(SupportSQLiteDatabase db) {
             db.execSQL("ALTER TABLE user ADD COLUMN address TEXT");
         }
     })
     .build();
0