Я недавно принял проект, который использует библиотеку постоянства Android и Retrofit.К сожалению, я не очень хорошо осведомлен ни в одной из этих библиотек.
В настоящее время я пытаюсь отправить через массив JSON записей, сохраненных с помощью Room, в API с помощью модернизации.
Моя сущность выглядит следующим образом:
@Entity(tableName = "location_table")
public class LocationEntity implements Serializable {
@NonNull
@PrimaryKey(autoGenerate = true)
private int id;
@SerializedName("job_id")
@ColumnInfo(name = "job_id")
@Expose
private String job_id;
@SerializedName("coordinates")
@ColumnInfo(name = "coordinates")
@Expose
private String coordinates;
@SerializedName("created_at")
@ColumnInfo(name = "created_at")
@Expose
private String created_at;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getJob_id() { return job_id; }
public void setJob_id(String job_id) { this.job_id = job_id; }
public String getCoordinates() { return coordinates; }
public void setCoordinates(String coordinates) { this.coordinates = coordinates; }
public String getCreated_at() { return created_at; }
public void setCreated_at(String created_at) { this.created_at = created_at; }
@Ignore
public LocationEntity() {
// DATA TO IGNORE
}
public LocationEntity(String job_id, String coordinates, String created_at) {
this.job_id = job_id;
this.coordinates = coordinates;
this.created_at = created_at;
}
}
В моем DOA у меня есть:
@Dao
public interface LocationDAO {
@Query("SELECT * from location_table ORDER BY id ASC")
List<LocationEntity> getAll();
}
А в репозитории:
public class LocationRepository {
private static BudtrackDatabase budtrackDatabase;
public LocationRepository(Context context) {
budtrackDatabase = Room.databaseBuilder(context, BudtrackDatabase.class, AppConstants.DATABASE_NAME).build();
}
public static List<LocationEntity> getLocations() {
return budtrackDatabase.locationDAO().getAll();
}
}
Мой запрос:
public interface LocationRequest {
/**
* Send through multiple locations
* @param token
* @param coordinates
*/
@FormUrlEncoded
@POST("api/coordinates")
Call<String> sendLocations(@Field("token") String token,
@Field("coordinates[]") List<LocationEntity> coordinates);
}
Затем я пытаюсь отправить данные, используя модификацию следующим образом:
String token = "12345";
List<LocationEntity> locations = locationRepository.getLocations();
Call<String> callLocation = sendLocationService.sendLocations(token, locations);
callLocation.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) {
// Logic for success
} else {
try {
JSONObject jObjError = new JSONObject(response.errorBody().string());
Toast.makeText(activity, jObjError.getString("message"), Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(activity, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.e("Failed To Send Location", t.getMessage());
}
});
Затем я получаю данные на стороне API примерно так:
"coordinates" : [
"com.yard8.budtrack.data.location.LocationEntity@4d87c17",
"com.yard8.budtrack.data.location.LocationEntity@6c60804",
"com.yard8.budtrack.data.location.LocationEntity@fdad1ed",
"com.yard8.budtrack.data.location.LocationEntity@66fc822",
"com.yard8.budtrack.data.location.LocationEntity@8dec2b3",
"com.yard8.budtrack.data.location.LocationEntity@f9da070",
];
Какой правильный способ отправкичерез данные, чтобы они представляли собой массив JSON?