3.27
一、后端 REST API 设计(分页与同步)
为 Android 客户端提供增量数据同步接口,减少流量消耗:
java
// 数据同步控制器
@RestController
@RequestMapping("/api/sync")
public class SyncController {
@Autowired
private UserRepository userRepository;
// 获取增量数据(基于时间戳)
@GetMapping("/users")
public ResponseEntity<List<User>> getUpdatedUsers(
@RequestParam("lastSyncTime") Long lastSyncTime) {
LocalDateTime time = LocalDateTime.ofEpochSecond(lastSyncTime / 1000, 0, ZoneOffset.UTC);
List<User> users = userRepository.findByUpdateTimeAfter(time);
return ResponseEntity.ok(users);
}
// 批量更新数据
@PostMapping("/users")
public ResponseEntity<String> batchUpdateUsers(@RequestBody List<User> users) {
userRepository.saveAll(users);
return ResponseEntity.ok("更新成功,共" + users.size() + "条数据");
}
}
二、Android 端本地数据库设计(Room)
使用 Room 库实现本地数据存储与同步:
java
// 用户数据实体
@Entity(tableName = "users")
public class User {
@PrimaryKey
private Long id;
private String username;
private String email;
@ColumnInfo(name = "update_time")
private Long updateTime;
// getter和setter省略...
}
// 数据访问对象
@Dao
public interface UserDao {
@Query("SELECT * FROM users")
List
@Query("SELECT * FROM users WHERE id = :id")
User findById(Long id);
@Insert(onConflict = OnConflictStrategy.REPLACE)
long insert(User user);
@Insert(onConflict = OnConflictStrategy.REPLACE)
long[] insertAll(List<User> users);
@Query("DELETE FROM users")
void deleteAll();
}
// 数据库实例
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static final String DATABASE_NAME = "demo_database";
private static volatile AppDatabase instance;
public abstract UserDao userDao();
public static AppDatabase getInstance(Context context) {
if (instance == null) {
synchronized (AppDatabase.class) {
if (instance == null) {
instance = Room.databaseBuilder(
context.getApplicationContext(),
AppDatabase.class,
DATABASE_NAME)
.fallbackToDestructiveMigration()
.build();
}
}
}
return instance;
}
}
三、数据同步流程实现
同步工具类:
java
public class DataSyncManager {
private static final long MIN_SYNC_INTERVAL = 5 * 60 * 1000; // 5分钟
private Context context;
private ApiService apiService;
private AppDatabase database;
private long lastSyncTime;
public DataSyncManager(Context context) {
this.context = context;
this.apiService = RetrofitClient.getApiService();
this.database = AppDatabase.getInstance(context);
this.lastSyncTime = PreferenceManager.getDefaultSharedPreferences(context)
.getLong("last_sync_time", 0);
}
public void syncData() {
long currentTime = System.currentTimeMillis();
if (currentTime - lastSyncTime < MIN_SYNC_INTERVAL) {
return; // 未到最小同步间隔
}
// 1. 上传本地修改的数据
uploadLocalChanges();
// 2. 下载服务器更新的数据
downloadServerUpdates();
// 3. 保存同步时间
PreferenceManager.getDefaultSharedPreferences(context)
.edit()
.putLong("last_sync_time", currentTime)
.apply();
lastSyncTime = currentTime;
}
private void uploadLocalChanges() {
// 获取本地修改的数据
List<User> localUsers = database.userDao().getAll();
if (localUsers.isEmpty()) return;
// 调用API上传
apiService.batchUpdateUsers(localUsers).enqueue(new Callback<ApiResponse<Void>>() {
@Override
public void onResponse(Call<ApiResponse<Void>> call, Response<ApiResponse<Void>> response) {
if (response.isSuccessful()) {
Log.d("DataSync", "本地数据上传成功");
} else {
Log.e("DataSync", "本地数据上传失败");
}
}
@Override
public void onFailure(Call<ApiResponse<Void>> call, Throwable t) {
Log.e("DataSync", "上传网络错误", t);
}
});
}
private void downloadServerUpdates() {
apiService.getUpdatedUsers(lastSyncTime).enqueue(new Callback<ApiResponse<List<User>>>() {
@Override
public void onResponse(Call<ApiResponse<List<User>>> call, Response<ApiResponse<List<User>>> response) {
if (response.isSuccessful() && response.body() != null && response.body().getData() != null) {
List<User> serverUsers = response.body().getData();
if (!serverUsers.isEmpty()) {
// 更新本地数据库
database.userDao().insertAll(serverUsers);
Log.d("DataSync", "下载" + serverUsers.size() + "条更新数据");
}
}
}
@Override
public void onFailure(Call<ApiResponse<List<User>>> call, Throwable t) {
Log.e("DataSync", "下载网络错误", t);
}
});
}
}
在应用中触发同步:
java
// 在Application或定时任务中调用
DataSyncManager syncManager = new DataSyncManager(this);
syncManager.syncData();

浙公网安备 33010602011771号