上一篇
安卓开发之数据库
- 行业动态
- 2025-04-22
- 3844
安卓本地数据库方案
SQLite数据库
- 核心特点:轻量级嵌入式数据库,支持SQL语法,无需独立服务器进程
- 使用步骤:
- 通过
SQLiteOpenHelper
创建/升级数据库 - 使用
SQLiteDatabase
执行CRUD操作 - 通过
ContentValues
构建数据条目
- 通过
// 创建数据库帮助类 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) { db.execSQL("ALTER TABLE user ADD COLUMN age INTEGER"); } }
方法类型 | 常用API | 作用 |
---|---|---|
插入 | insert() | 添加新记录 |
查询 | query() | 获取符合条件的数据集 |
更新 | update() | 修改现有记录 |
删除 | delete() | 移除指定记录 |
Room持久化库
- 核心优势:基于SQLite的抽象层,提供编译时验证,支持LiveData响应式编程
- 关键组件:
@Entity
:定义数据表结构@Dao
:声明数据访问接口@Database
:配置数据库参数
// 定义实体类 @Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = 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); }
网络数据库方案
Firebase Realtime Database
特性:
- 云端NoSQL数据库
- 实时数据同步
- 离线数据支持
使用方式:
// 初始化数据库引用 DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); // 写入数据 ref.child("users").push().setValue(new User("John",25)); // 监听数据变化 ref.addChildEventListener(new ChildEventListener() {...});
操作类型 | Firebase API | 功能说明 |
---|---|---|
读取 | addValueEventListener() | 监听数据节点变化 |
写入 | setValue() /push() | 设置/追加数据 |
查询 | orderByChild() | 按字段排序查询 |
离线 | setPersistenceEnabled(true) | 启用本地数据缓存 |
RESTful API通信
- 典型场景:与自建服务器或第三方服务(如天气API)交互
- 实现要点:
- 使用
Retrofit
+OkHttp
组合 - 配置数据转换器(Gson/Moshi)
- 处理网络权限和安全认证
- 使用
// 定义API接口 public interface ApiService { @GET("users/{id}") Call<User> getUser(@Path("id") int id); }
数据操作最佳实践
本地数据库操作规范
操作场景 | 推荐方案 | 注意事项 |
---|---|---|
主线程操作 | 使用异步任务(AsyncTask/Coroutine) | 避免阻塞UI线程 |
多表关联查询 | 使用JOIN 语句 | 注意性能消耗 |
复杂事务处理 | 开启事务(beginTransaction()) | 确保原子性操作 |
网络请求优化策略
- 缓存机制:
- 内存缓存:使用
LruCache
存储短期数据 - 磁盘缓存:配置OkHttp缓存目录
- 内存缓存:使用
- 并发控制:
- 使用
RxJava
进行线程调度 - 配合
ReplaySubject
缓存网络结果
- 使用
- 错误处理:
- 统一封装HTTP状态码处理
- 实现重试机制(指数退避算法)
常见问题与解决方案
数据库升级导致数据丢失
- 原因:
onUpgrade()
方法未正确处理数据迁移 - 解决方案:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { db.execSQL("ALTER TABLE user ADD COLUMN age INTEGER DEFAULT 0"); } // 其他版本升级逻辑... }
Room编译错误处理
- 常见错误:
- @Entity字段缺少getter/setter
- DAO方法参数未标注@Query/@Insert等注解
- 解决技巧:
- 启用kapt编译检查(Android Studio配置)
- 使用
AutoValue
简化实体类编写
相关问题与解答
Q1:如何选择本地数据库与网络数据库的结合方式?
- A:根据数据特性选择:
- 本地私有数据(如用户设置):使用Room/SQLite
- 跨设备共享数据(如用户资料):优先网络数据库(Firebase/自建服务)
- 混合场景:采用本地缓存+远程同步策略,例如使用Room的
TypeConverter
处理网络数据持久化
Q2:Room数据库如何实现复杂查询?
- A:通过以下方式扩展查询能力:
- @Query注解:编写原生SQL语句(支持参数绑定)
- 关系型操作:使用
@Transaction
处理多表联合查询 - 嵌套查询:通过
List
类型字段存储关联数据集合 - 示例:
@Query("SELECT FROM user WHERE age > :minAge AND city=:city")