【问题标题】:Get data array from sqlite database and post to API via json object... can be possible?从 sqlite 数据库中获取数据数组并通过 json 对象发布到 API ...可以吗?
【发布时间】:2019-04-25 16:05:31
【问题描述】:

新手在这里...我正在开发通过改造将我的数据发送到 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 数据库:

这是我在顶部创建的示例帖子

但就我而言,我喜欢做的是这个,从我的数据库中获取保存的数据并像这样发送:

【问题讨论】:

    标签: json sqlite android-studio post retrofit2


    【解决方案1】:

    只发送一个的原因是你在遍历光标的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 已填充,在这种情况下,您可能只需要在循环中最多 data.add(mapDetails);,然后在循环外添加以下代码。

    【讨论】:

    • 先生,对不起,我没有添加我的数据库和测试.. 我只是编辑我的帖子,以便您可以详细说明:)
    • @JuliusAndaya 您添加的内容似乎没有任何改变。答案似乎仍然表明存在问题,并且还包括解决问题的指南。
    【解决方案2】:

    如果我正确理解了您的问题,您需要发送 JSONArray 作为请求的有效负载。但是,您在从 SQLite 数据库准备负载时犯了一个小错误。 @Mike T 在他的answer 中针对您的问题指出了这个错误。

    按照这些代码解决问题。

    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。如果它们在每一行中都相同,您不需要从数据库中获取它吗?

    【讨论】:

    • 抱歉,先生,我又弄错了,我没有显示我的完整数据库......在我的问题上,端口和地址来自另一个 dbTable,在我的问题方面是这个“ MapDetails mapDetails = new MapDetails(gg, lat, lon, well, "0", portInts)"... 这些数据 "gg,lat,lon,well,0,pointints" 是静态变量,来自我的地图数据和其他字符串......但我喜欢做的是我将从数据库中获取数据(5组数据)并将其全部发送到api......而不仅仅是我检索并将其发送到api的那个。 ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2011-09-11
    • 1970-01-01
    • 2022-11-21
    • 2011-10-10
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多