繁体   English   中英

从sqlite数据库获取数据数组,然后通过json对象发布到API……可能吗?

[英]Get data array from sqlite database and post to API via json object… can be possible?

新手在这里...我正在开发通过改造将我的数据发送到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数据库我喜欢检索: 在此处输入图片说明

这是在顶部创建的示例发布ive。 在此处输入图片说明

但就我而言,我想做的就是这个,从我的数据库中获取保存的数据并像这样发送: 在此处输入图片说明

之所以只发送一个,是因为您是在游标遍历的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(用于移植目的),然后

输入循环,将ADDRESS设置为1,将下一个迭代将其设置为2,再将其设置为3 .....,最后将ADDRESS设置为10(PORT和TIMEINTERVAL相同)

循环之后,将发送数据,因此仅发送一个(地址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.add(mapDetails); 在循环中,然后在循环外添加以下代码。

如果我正确理解了您的问题,则需要发送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 :我不确定您为什么要从SQLite数据库中获取ADDRESSPORT 如果它们在每一行中都相同,那么您不需要从数据库中获取数据吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM