上一篇
安卓开发关于数据库
- 行业动态
- 2025-04-23
- 2
安卓开发中数据库常采用SQLite实现本地存储,通过ContentProvider或Room库简化操作,SQLite支持增删改查,适合轻量级数据管理; Room提供对象映射,提升开发效率,两者均依赖Android API实现数据持久
安卓数据库基础概念
类型 | 说明 |
---|---|
SQLite | 安卓内置的轻量级关系型数据库,适合本地存储结构化数据 |
Room | Android Jetpack 组件,提供抽象层简化SQLite操作,支持编译时校验 |
Realm | 高性能对象关系映射数据库,支持跨平台,但需引入第三方库 |
Firebase Firestore | 云数据库服务,适合需要实时同步的场景(需网络) |
SQLite 实现步骤
创建数据库帮助类
public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context) { super(context, "app.db", null, 1); // 数据库名称和版本号 } @Override public void onCreate(SQLiteDatabase db) { // 创建表语句 db.execSQL("CREATE TABLE user(id INTEGER PRIMARY KEY,name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级逻辑 } }
增删改查操作
// 插入数据 ContentValues values = new ContentValues(); values.put("name", "张三"); db.insert("user", null, values); // 查询数据 Cursor cursor = db.query("user", null, "id=?", new String[]{"1"}, null, null, null); if(cursor.moveToFirst()){ String name = cursor.getString(cursor.getColumnIndex("name")); }
Room 持久化库使用
定义实体
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerateId = true) public int id; public String name; }
创建DAO接口
@Dao public interface UserDao { @Insert void insertUser(User... users); @Query("SELECT FROM user WHERE id=:userId") User getUserById(int userId); }
配置数据库
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
常见问题与解决方案
问题 | 解决方案 |
---|---|
主线程操作数据库崩溃 | 使用AsyncTask 或ExecutorService 在子线程执行数据库操作 |
数据库升级数据丢失 | 实现onUpgrade() 方法,使用ALTER TABLE 或数据迁移脚本保留历史数据 |
Room编译错误 | 检查@Entity 字段与@Dao 方法参数是否匹配,确保使用.allowMainThreadQueries() 调试 |
相关问题与解答
问题1:如何选择SQLite和Room?
解答:
- SQLite:适合简单场景,需手动管理线程和SQL语句
- Room:推荐复杂项目,提供编译时校验、流畅API和LiveData支持,减少崩溃风险
- 性能对比:Room在大量数据操作时性能优于直接SQLite操作
问题2:如何处理多线程并发访问数据库?
解答:
- 允许多线程查询:通过
Room.databaseBuilder
启用.allowMainThreadQueries()
(仅限调试) - 事务操作:使用
@Transaction
注解保证原子性 - 线程池管理:结合
RxJava
或Coroutine
在IO线程执行数据库操作 - 冲突策略:在
@Insert
等注解中设置onConflict
参数(如OnConflictStrategy.REPLACE
)