Отправка данных из библиотеки постоянства Room с использованием Retrofit - PullRequest
0 голосов
/ 12 февраля 2019

Я недавно принял проект, который использует библиотеку постоянства 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?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Я, возможно, пытался слишком усложнить ситуацию, и все, что мне нужно было сделать, это изменить

@Field("coordinates[]") List<LocationEntity> coordinates

на

@Field("coordinates") String coordinates

А затем перед использованием вызова ...

Gson gson = new Gson();
String locations = gson.toJson(locationRepository.getLocations());

... и передать его в качестве моего второго параметра.

Call<String> callLocation = sendLocationService.sendLocations(token, locations);

Я действительно думал, что это будет работать только на одном объекте, а не на их списке из-за способаЯ принимал сторону сервера данных.

0 голосов
/ 12 февраля 2019

Вы пробовали что-то вроде этого

1.Создание нового класса

class ParentEntity{

        private List<LocationEntity> locationEntities;

        public List<LocationEntity> getLocationEntities() {
            return locationEntities;
        }

        public void setLocationEntities(List<LocationEntity> locationEntities) {
            this.locationEntities = locationEntities;
        }
    }

2.Затем в своем ответе модифицируйте

// ....... //
@Override
public void onResponse(Call<String> call, Response<String> response) {
    if (response.isSuccessful()) {
        // Logic for success
        ParentEntity readObj = response.body();
        List<LocationEntity> locations = readObj.getLocationEntities();

        // DO SOMETHING YOU WANT

    } 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();
        }
    }
}
// ....... //

ОБНОВЛЕНИЕ попробуйте использовать @Body, вероятно, структуру, как показано ниже 1. Создайте новый класс

class ParentEntity{

        private LocationEntity location;
        private String token;

        public LocationEntity getLocation() {
            return location;
        }

        public void setLocation(LocationEntity location) {
            this.location = location;
        }

        public String getToken() {
            return token;
        }

        public void setToken(String token) {
            this.token = token;
        }
    }

Использовать тело вместо поля, также без @FormUrlEncoded

@ POST ("/") Вызов sendLocations (@Body ParentEntity parentEntity);

...