上一篇
安卓建立数据库
- 行业动态
- 2025-04-22
- 4875
使用SQLite建立数据库
SQLite是安卓原生支持的轻量级数据库,适合存储结构化数据。
创建数据库帮助类
通过继承SQLiteOpenHelper
实现数据库创建和版本管理:
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:数据库版本升级时如何处理?
解答:
- SQLite:在
onUpgrade()
中执行ALTER TABLE
或CREATE TABLE
语句 - 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();