Получить массив данных из базы данных sqlite и опубликовать в API через объект json ... это возможно? - PullRequest
0 голосов
/ 23 ноября 2018

новичок здесь ... я разрабатывал приложение, которое отправляет мои данные в API через модернизацию.мой код работал, но он отправляет 1 ввод данных только в то время .... в моем случае, я хотел бы сделать, я хочу получить больше сохраненных данных в моем sqlite (пример 5 сохраненных данных) и отправить все это наAPI через объект JSON.

Это моя активность:

                 DatabaseHelper databaseHelper2 = new 
                 DatabaseHelper(getApplicationContext());
                    SQLiteDatabase db2 = 
                    databaseHelper2.getWritableDatabase();
                    Cursor cursor = 
                    databaseHelper2.retrieveSettingFromLocalDatabase(db2);

                    while (cursor.moveToNext()) {
                        ADDRESS = 

    cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_ADDRESS));
                        PORT = 
    cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_PORT));
                        TIMEINTERVAL=cursor.getString
    (cursor.getColumnIndex(DatabaseHelper.SETTING_TIME_INTERVAL));
                    }
                    portInts=Integer.parseInt(PORT);

                    MapDetails mapDetails = new MapDetails(gg, lat, lon, 
        well, "0", portInts); //Datas ive get to send in api

                    List<MapDetails> data = new ArrayList<>();
                    data.add(mapDetails);

                    Retrofit.Builder builder = new Retrofit.Builder()
                            .baseUrl("http://" + ADDRESS + ":" + PORT) 
                            .addConverterFactory(GsonConverterFactory.create());

                    Retrofit retrofit = builder.build();

                    Api locate = retrofit.create(Api.class);

                    Call<MapDetails> call = locate.mapDetailLocation(data);     

                    call.enqueue(new Callback<MapDetails>() {
                        @Override
                        public void onResponse(Call<MapDetails> call, Response<MapDetails> response) {
                            Snackbar.make(view, "" + response,
                                    Snackbar.LENGTH_INDEFINITE)
                                    .setAction("Action", null).show();
                        }

                        @Override
                        public void onFailure(Call call, Throwable t) {
                            Snackbar.make(view, "" + t.getMessage(),
                                    Snackbar.LENGTH_INDEFINITE)
                                    .setAction("Action", null).show();

                        }
                    });

Это мой код в API:

 public interface Api {
   @POST("/api/Database/NewLocation")
      Call<MapDetails> mapDetailLocation(@Body List<MapDetails> mapDetails)

 }

Это мой пример клиента:

     public class MapDetails {
        @SerializedName("SerialNumber")
        @Expose
        private String SerialNumber;
        @SerializedName("Coordinate1")
        @Expose
        private String Coordinate1;
        @SerializedName("Coordinate2")
        @Expose
        private String Coordinate2;
        @SerializedName("DateTime")
        @Expose
        private String DateTime;
        @SerializedName("Speed")
        @Expose
        private String Speed;
        @SerializedName("Port")
        @Expose
        private int Port;

        public MapDetails(String serialNumber, String coordinate1, String                 
         coordinate2, String dateTime, String speed, int port) {
            SerialNumber = serialNumber;
            Coordinate1 = coordinate1;
            Coordinate2 = coordinate2;
            DateTime = dateTime;
            Speed = speed;
            Port = port;
        }

        public String getSerialNumber() {
            return SerialNumber;
        }

        public void setSerialNumber(String serialNumber) {
            SerialNumber = serialNumber;
        }

        public String getCoordinate1() {
            return Coordinate1;
        }

        public void setCoordinate1(String coordinate1) {
            Coordinate1 = coordinate1;
        }

        public String getCoordinate2() {
            return Coordinate2;
        }

        public void setCoordinate2(String coordinate2) {
            Coordinate2 = coordinate2;
        }

        public String getDateTime() {
            return DateTime;
        }

        public void setDateTime(String dateTime) {
            DateTime = dateTime;
        }

        public String getSpeed() {
            return Speed;
        }

        public void setSpeed(String speed) {
            Speed = speed;
        }

        public int getPort() {
            return Port;
        }

        public void setPort(int port) {
            Port = port;
        }

    }

это моя база данных sqlite, которую я хотел бы получить: enter image description here

это пример размещения сообщений, созданный сверху enter image description here

но в моем случае я хотел бы вот что: получить сохраненные данные из моей базы данных и отправить их так: enter image description here

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Если я правильно понял ваш вопрос, вам нужно отправить JSONArray в качестве полезной нагрузки для запроса.Но вы допустили небольшую ошибку при подготовке полезной нагрузки из базы данных SQLite.@Mike T указал на эту ошибку в своем ответе на ваш вопрос.

Следуйте этим кодам, чтобы решить проблему.

DatabaseHelper databaseHelper2 = new DatabaseHelper(getApplicationContext());
SQLiteDatabase db2 = databaseHelper2.getWritableDatabase();
Cursor cursor = databaseHelper2.retrieveSettingFromLocalDatabase(db2);

List<MapDetails> data = new ArrayList<>(); // declare ArrayList outside and before while loop

while (cursor.moveToNext()) {
    ADDRESS = cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_ADDRESS));
    PORT = cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_PORT));
    TIMEINTERVAL = cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_TIME_INTERVAL));

    // pass arguments to MapDetails class constructor

    portInts = Integer.parseInt(PORT);

    MapDetails mapDetails = new MapDetails(gg, lat, lon, well, "0", portInts); //Datas ive get to send in api

    // add prepared data to ArrayList

    data.add(mapDetails);
}

// and finally execute network call

Retrofit.Builder builder = new Retrofit.Builder()
                        .baseUrl("http://" + ADDRESS + ":" + PORT) 
                        .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();

Api locate = retrofit.create(Api.class);

Call<MapDetails> call = locate.mapDetailLocation(data);     
call.enqueue(new Callback<MapDetails>() {
    @Override
    public void onResponse(Call<MapDetails> call, Response<MapDetails> response) {

        Snackbar.make(view, "" + response, Snackbar.LENGTH_INDEFINITE).setAction("Action", null).show();

    }

    @Override
    public void onFailure(Call call, Throwable t) {

        Snackbar.make(view, "" + t.getMessage(), Snackbar.LENGTH_INDEFINITE).setAction("Action", null).show();

    }
});

PS Я не уверен, почему вы берете ADDRESS и PORT из базы данных SQLite.Если они одинаковы в каждой строке, вам не нужно брать их из базы данных, верно?

0 голосов
/ 23 ноября 2018

Причина, по которой отправляется только одна, заключается в том, что вы отправляете вне цикла while, который проходит через Курсор, поэтому отправляется только последняя.

То есть у вас: -

while (cursor.moveToNext()) {
    ADDRESS = cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_ADDRESS));
    PORT = cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_PORT));
    TIMEINTERVAL=cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_TIME_INTERVAL));
 }

Допустим, запрос извлек курсор с 10 строками в качестве адреса 1,2,3 .... 10 (для пояснения), затем

Введен цикл: АДРЕС установлен в 1, следующийитерация устанавливает его на 2, затем на 3 ..... и, наконец, ADDRESS устанавливается на 10 (то же самое для PORT и TIMEINTERVAL)

После цикла данные отправляются, поэтому отправляется только один (ADDRESS 10).

То, что вам нужно, это: -

List<MapDetails> data = new ArrayList<>();
MapDetails mapDetails
Retrofit.Builder builder;
Retrofit retrofit;
Call<MapDetails> call;
Api locate;

while (cursor.moveToNext()) {
    ADDRESS = cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_ADDRESS));
    PORT = cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_PORT));
    TIMEINTERVAL=cursor.getString(cursor.getColumnIndex(DatabaseHelper.SETTING_TIME_INTERVAL));

    portInts=Integer.parseInt(PORT);
    mapDetails = new MapDetails(gg, lat, lon, well, "0", portInts);
    data.clear(); //<<<<<<<< remove previous entries if required????
    data.add(mapDetails);
    builder = new Retrofit.Builder()
            .baseUrl("http://" + ADDRESS + ":" + PORT) 
            .addConverterFactory(GsonConverterFactory.create());
    retrofit = builder.build();
    locate = retrofit.create(Api.class);
    call = locate.mapDetailLocation(data);     
    call.enqueue(new Callback<MapDetails>() {
        @Override
        public void onResponse(Call<MapDetails> call, Response<MapDetails> response) {
            Snackbar.make(view, "" + response,
            Snackbar.LENGTH_INDEFINITE).setAction("Action", null).show();
        }

        @Override
        public void onFailure(Call call, Throwable t) {
            Snackbar.make(view, "" + t.getMessage(),
            Snackbar.LENGTH_INDEFINITE).setAction("Action", null).show();
     }
}
  • Примечание выше - это принципиальный код.он не был проверен или протестирован и поэтому может содержать некоторые ошибки.
  • Возможно, вы можете отправить весь набор, например data , с заполнением, в этом случае вам может понадобиться толькодо data.add(mapDetails); в цикле и затем иметь следующий код вне цикла.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...