SQLiteDatabase
直接查询SQLiteDatabase
(通过SQLiteOpenHelper
管理)rawQuery(String sql, String[] selectionArgs)
:直接执行SQL语句。query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
:参数化查询。// 获取可读数据库 SQLiteDatabase db = helper.getReadableDatabase(); // 查询users表中age大于?的记录 Cursor cursor = db.query("users", new String[]{"id", "name", "age"}, "age > ?", new String[]{"18"}, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(0); String name = cursor.getString(1); int age = cursor.getInt(2); // 处理数据 } cursor.close(); // 必须关闭Cursor
ContentValues
批量插入后查询// 插入数据 ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 25); db.insert("users", null, values);
// 查询所有用户
Cursor cursor = db.rawQuery(“SELECT FROM users”, null);
二、Room持久库查询
# 1. 定义实体和DAO
```java
// 实体类
@Entity(tableName = "users")
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
public String name;
public int age;
}
// DAO接口
@Dao
public interface UserDao {
@Query("SELECT FROM users WHERE age > :minAge")
List<User> getUsersByAge(int minAge);
}
@Query
实现复杂查询功能 | 示例代码 |
---|---|
模糊查询 | @Query("SELECT FROM users WHERE name LIKE :name") List<User> search(String name) |
分页查询 | @Query("SELECT FROM users LIMIT :offset, :limit") List<User> paginate(int offset, int limit) |
关联查询(需@Transaction) | @Transaction @Query("SELECT FROM orders WHERE user_id = :userId") List<Order> getOrders(int userId) |
@Dao public interface UserDao { @Query("SELECT FROM users WHERE age > :minAge") LiveData<List<User>> observeUsersByAge(int minAge); // 自动感知数据变更 }
public interface ApiService { @GET("users") Call<List<User>> getUsers(@Query("age_gt") int age); }
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/api/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService api = retrofit.create(ApiService.class); Call<List<User>> call = api.getUsers(18); call.enqueue(new Callback<>() { @Override public void onResponse(Call<List<User>> call, Response<List<User>> response) { List<User> users = response.body(); // 处理数据 } @Override public void onFailure(Call<List<User>> call, Throwable t) { // 处理错误 } });
方案 | 优点 | 缺点 |
---|---|---|
Retrofit+RxJava | 链式调用,灵活组合操作 | 学习成本较高 |
Retrofit+协程(Kotlin) | 简洁易读,避免回调地狱 | 仅支持Kotlin |
OkHttp+手动解析 | 完全控制请求过程 | 代码量大,易出错 |
AsyncTask
、Executor
或协程)LiveData
中自动异步查询Cursor
必须手动关闭Database
实例需正确管理生命周期SQLCipher
)A:
| 对比维度 | SQLite直接操作 | Room持久库 |
|————–|———————————–|————————————|
| 开发效率 | 需手写大量SQL语句和CRUD逻辑 | 通过注解自动生成代码,减少模板代码 |
| 编译时检查 | 无类型安全检查 | 编译时验证SQL正确性,避免运行时错误 |
| 架构适配 | 需手动处理LiveData/ViewModel集成 | 内置支持LiveData和RxJava |
| 多表操作 | 需手动管理事务 | 支持@Transaction注解自动事务管理 |
A:
定义关联实体:
@Entity(tableName = "orders") public class Order { @PrimaryKey(autoGenerate = true) public int id; public int userId; public String product; }
在DAO中声明事务:
@Dao public interface OrderDao { @Transaction @Query("SELECT FROM users WHERE id IN (SELECT user_id FROM orders)") List<UserWithOrders> getUsersWithOrders(); // 需定义UserWithOrders为嵌套类 }
处理嵌套数据:
public class UserWithOrders { @Embedded public User user; @Relation(parentColumn = "id", entityColumn = "user_id") public List<Order> orders; }