在安卓开发中,”接收数据库”通常指从数据库中读取数据到应用程序,根据数据库类型不同,分为以下两种常见场景:
数据库类型 | 适用场景 | 技术方案 |
---|---|---|
本地数据库 | SQLite(轻量级嵌入式数据库) | Room持久化库/SQLiteDatabase API |
远程数据库 | MySQL/PostgreSQL(服务器端数据库) | Retrofit+JSON解析/Firebase SDK |
implementation "androidx.room:room-runtime:2.5.1" annotationProcessor "androidx.room:room-compiler:2.5.1"
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerateId = true) private int id; private String name; // Getter/Setter... }
@Dao public interface UserDao { @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(); List<User> users = db.userDao().getAllUsers(); // 同步读取
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
public interface ApiService { @GET("/users") Call<List<User>> getUsers(); // 假设返回[{"id":1,"name":"Alice"},...] }
public class User { private int id; private String name; // Getter/Setter... }
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(); call.enqueue(new Callback<List<User>>() { @Override public void onResponse(Call<List<User>> call, Response<List<User>> response) { if (response.isSuccessful()) { List<User> users = response.body(); // 接收成功 } } @Override public void onFailure(Call<List<User>> call, Throwable t) { // 处理失败 } });
特性 | SQLite(本地) | Retrofit(远程) |
---|---|---|
数据存储位置 | 设备本地文件系统 | 服务器端数据库 |
网络依赖 | 无 | 需要网络连接 |
性能 | 高(本地IO) | 依赖网络速度 |
数据实时性 | 需手动同步 | 可实时获取最新数据 |
解答:
WorkManager
定期检查远程数据更新 Room
的TypeConverters
处理复杂数据类型 DAO
中编写INSERT
/UPDATE
冲突解决策略(如ON CONFLICT REPLACE
) // 插入时替换旧数据 @Insert(onConflict = OnConflictStrategy.REPLACE) void insertAll(List<User> users);
解答:
LIMIT
和OFFSET
分批获取数据 OkHttp
的Streaming
功能逐行解析 Cursor
代替List
存储本地数据 Gson
实例 @GET("/users") Call<List<User>> getUsers(@Query("page") int page, @Query("size") int size);