上一篇
安卓开发数据库保存
- 行业动态
- 2025-04-22
- 2
使用SQLite数据库保存数据
SQLite是Android内置的轻量级数据库,适合存储结构化数据,以下是基本操作步骤:
创建数据库帮助类
继承SQLiteOpenHelper
,用于管理数据库创建和版本升级。
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app_data.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," + "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(); ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 25); db.insert("user", null, values); // 查询数据 Cursor cursor = db.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(); // 更新数据 values.clear(); values.put("age", 26); db.update("user", values, "name = ?", new String[]{"张三"}); // 删除数据 db.delete("user", "id = ?", new String[]{"1"});
使用Room数据库保存数据
Room是Android Jetpack组件,提供更高效的数据库访问抽象层。
定义实体类
@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> getUsersOlderThan(int minAge); @Update void update(User user); @Delete void delete(User user); }
构建数据库类
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
使用数据库
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app_data.db").build(); UserDao userDao = db.userDao(); // 插入数据 User user = new User(); user.name = "李四"; user.age = 30; userDao.insert(user); // 查询数据(支持LiveData) LiveData<List<User>> users = userDao.getUsersOlderThan(25); users.observe(this, list -> { // 处理数据... });
SQLite与Room对比
特性 | SQLite | Room |
---|---|---|
代码复杂度 | 高(需手动管理SQL) | 低(面向对象操作) |
编译时检查 | 无 | 支持(通过注解) |
线程安全 | 需手动处理 | 自动支持(LiveData/Flow) |
扩展性 | 低(需手写迁移逻辑) | 高(支持迁移工具) |
常见问题与解答
问题1:数据库版本升级时如何处理?
解答:
- SQLite:在
onUpgrade()
方法中执行ALTER TABLE
或重建表逻辑。 - Room:使用
migrationStrategy
配置迁移策略,或调用fallbackToDestructiveMigration()
(会清空数据)。
示例:Room.databaseBuilder(context, AppDatabase.class, "app_data.db") .addMigrations(new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE user ADD COLUMN address TEXT"); } }).build();
问题2:如何在子线程中执行数据库操作?
解答:
- SQLite:通过
AsyncTask
或ExecutorService
在后台线程执行数据库操作。 - Room:默认支持多线程,但复杂操作建议使用
RxJava
或Coroutines
。
示例(协程):GlobalScope.launch(Dispatchers.IO) { val user = userDao.getUsersOlderThan(25) withContext(Dispatchers.Main) { // 更新UI... } }