上一篇
安卓开发中怎么跟数据库交互
- 行业动态
- 2025-04-23
- 6
Android与数据库交互可通过SQLite(原生轻量级)、Room(Jetpack组件,提供对象关系映射)或网络数据库(如Firebase),使用 Room需定义实体类、DAO接口,通过ViewModel+LiveData实现异步操作,确保线程安全
安卓数据库交互方式
安卓开发中与数据库交互的方式主要分为 本地数据库 和 远程数据库 两类:
类型 | 典型方案 | 适用场景 |
---|---|---|
本地数据库 | SQLite、Room(Jetpack 组件) | 轻量级本地数据存储 |
远程数据库 | MySQL(自建)、Firebase(云数据库) | 多设备同步、云端存储 |
本地数据库交互(以 SQLite 和 Room 为例)
SQLite 直接操作
SQLite 是安卓内置的轻量级数据库,需手动管理创建、升级和操作。
核心步骤:
创建数据库帮助类
继承SQLiteOpenHelper
,实现onCreate()
和onUpgrade()
方法。public class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public DBHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @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) { // 处理数据库升级逻辑 } }
执行 CRUD 操作
通过SQLiteDatabase
对象执行 SQL 语句。// 插入数据 ContentValues values = new ContentValues(); values.put("name", "张三"); db.insert("user", null, values); // 查询数据 Cursor cursor = db.rawQuery("SELECT FROM user", null); while (cursor.moveToNext()) { int id = cursor.getInt(0); String name = cursor.getString(1); }
Room 持久化库(推荐)
Room 是谷歌提供的 SQLite 抽象层,通过注解简化操作并支持 LiveData。
核心步骤:
定义实体类
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; }
创建 DAO 接口
@Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM user") List<User> getAllUsers(); }
构建数据库类
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
使用数据库
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db").build(); UserDao userDao = db.userDao(); userDao.insert(new User(0, "李四")); // 插入数据 List<User> users = userDao.getAllUsers(); // 查询数据
远程数据库交互(以 MySQL 和 Firebase 为例)
MySQL(通过 API 交互)
通常通过 Retrofit + JSON 解析实现与远程 MySQL 的交互。
核心步骤:
定义 Retrofit 接口
public interface ApiService { @POST("/user/add") Call<BaseResponse> addUser(@Body User user); }
发送网络请求
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://yourserver.com/api/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); apiService.addUser(new User("王五")).enqueue(new Callback<BaseResponse>() { @Override public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) { // 处理成功逻辑 } @Override public void onFailure(Call<BaseResponse> call, Throwable t) { // 处理失败逻辑 } });
Firebase 云数据库
Firebase 提供实时数据库和 Firestore,适合快速集成。
核心步骤(Firestore):
添加依赖
implementation 'com.google.firebase:firebase-firestore:24.0.0'
写入/读取数据
// 初始化 Firestore FirebaseFirestore db = FirebaseFirestore.getInstance(); // 添加数据 Map<String, Object> user = new HashMap<>(); user.put("name", "赵六"); db.collection("users").add(user).addOnSuccessListener(documentReference -> { // 成功回调 }); // 查询数据 db.collection("users").get().addOnCompleteListener(task -> { if (task.isSuccessful()) { for (DocumentSnapshot doc : task.getResult().getDocuments()) { String name = doc.getString("name"); } } });
常见问题与解决方案
问题 | 解决方案 |
---|---|
主线程操作数据库卡顿 | 使用异步任务(如 ExecutorService 、AsyncTask 或 RxJava)处理数据库操作 |
数据库文件过大 | SQLite 定期清理无用数据;远程数据库分库分表或使用云存储优化 |
数据加密需求 | SQLite 使用 AES 加密敏感字段;Firebase 启用安全规则限制访问权限 |
数据库版本升级 | SQLite 重写 onUpgrade() 方法;Room 使用 migrationStrategy 自动迁移 |
相关问题与解答
问题1:如何选择本地数据库与远程数据库?
- 本地数据库:适合存储少量高频访问数据(如用户偏好、缓存),无需网络。
- 远程数据库:适合多设备同步、大规模数据存储(如社交内容、订单信息),需网络支持。
问题2:Room 如何实现复杂查询?
- 使用
@Query
注解直接写 SQL,@Query("SELECT FROM user WHERE name LIKE :name") List<User> searchUsers(String name);
- 支持参数传递和动态条件拼接,复杂逻辑可通过
RawQuery
结合 LiveData