Android Studio SQLite, исключение указателя за пределами границ - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь разработать приложение, которое хранит данные локально в базе данных SQLite, которые впоследствии могут быть перенесены в онлайн-базу данных, когда планшет с приложением имеет соединение WiFi.Локальное хранилище работает нормально - каждый раз, когда я добавляю запись, она сохраняется без проблем.Соединение с онлайн-базой данных работает без проблем - если я отправляю ей пустые данные, он вводит пустую запись.Но, когда я пытаюсь получить данные из SQLite и отправить эти данные, я получаю указатель указателя за исключением границ, и я не понимаю, почему.

Мой код Java выглядит следующим образом:

public void send_onClick(View v) {
    int numRecords = data.getCount();
    final TextView records = (TextView) findViewById(R.id.lblRecords);
    final Button send = (Button) findViewById(R.id.btnSend);

    send.setClickable(false);
    // Loop through the records and send them
    while (data.moveToNext()) {

        // Load the string request
        StringRequest stringRequest = new StringRequest(Request.Method.POST, serverUrl,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        if (!response.equals("false")) success = true;
                        else Toast.makeText(SendDataActivity.this, "False response.", Toast.LENGTH_SHORT).show();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(SendDataActivity.this, "An unknown error occurred.", Toast.LENGTH_SHORT).show();
                        error.printStackTrace();
                    }
                }){

            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("key","###");
                params.put("a", data.getString(1));
                params.put("b", data.getString(2));
                params.put("c", data.getString(3));
                params.put("d", data.getString(4));
                params.put("e", data.getString(5));
                params.put("f", data.getString(6));
                params.put("g", data.getString(7));
                params.put("h", data.getString(8));
                params.put("i", data.getString(9));
                params.put("j", data.getString(10));
                return params;
            }
        };

        RequestHandler.getInstance(SendDataActivity.this).addToRequestQueue(stringRequest);

        // Remove the record from the SQLite if it worked
        if (success) {
            dbHelper.deleteRecord(data.getString(0));
            numRecords--;
            records.setText(Integer.toString(numRecords));
            success = false;
        }

    }

    send.setClickable(true);

    // If there are no records left, hide the button
    if (numRecords == 0) send.setVisibility(View.GONE);
}

Итак, как вы можете видеть, когда пользователь нажимает «отправить», он должен перебирать каждую запись в SQLite и отправлять HTTP-запрос POST.Я знаю, что почтовый запрос работает, потому что если вы заменяете параметры пробелами, они добавляются в базу данных.Кажется, проблема связана с data.getString (1) и т. Д., Который я пытаюсь вставить в карту.

E/Volley: [181] NetworkDispatcher.processRequest: Unhandled exception android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
      android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
          at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460)
          at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
          at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
          at com.lensofamoose.testapp.SendDataActivity$4$override.getParams(SendDataActivity.java:118)
          at com.lensofamoose.testapp.SendDataActivity$4$override.access$dispatch(SendDataActivity.java)
          at com.lensofamoose.testapp.SendDataActivity$4.getParams(SendDataActivity.java:0)
          at com.android.volley.Request.getBody(Request.java:464)
          at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:275)
          at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:249)
          at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:94)
          at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:123)
          at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:131)
          at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111)
          at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90)

Здесь вы видите ошибку, которая говорит мне, что у меня естьКурсор за пределами исключения.Если есть только одна запись, то это индекс 1, размер 1. Если есть две записи, я получаю индекс 2, размер 2 и т. Д. «SendDataActivity.java:118» - первая строка, где я пытаюсь использовать данные.getString ().

Я перепробовал все возможные способы цикла.Я попытался поставить moveToFirst () с последующим do-while.Я попытался проверить isAfterLast () и вернуть, если это правда.Кажется, ничто не помогает: я не вижу логической причины, по которой он пытается получить индекс «вне границ», потому что даже когда я изменяю цикл, чтобы попытаться принять это во внимание, я все равно, похоже, получаю ту же ошибку.Есть идеи?

РЕДАКТИРОВАТЬ:

Данные извлекаются следующим образом:

public Cursor getData() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
    return data;
}

И этот метод передается в переменную данных сследующее:

data = dbHelper.getData();

1 Ответ

0 голосов
/ 03 октября 2018

После долгих часов игры выяснилось, что проблема была в том, в какой области я пытаюсь получить доступ к данным.Если в начале цикла while я сохраняю необходимые данные в конечной переменной и вызываю их из params.map () вместо data.getString (), я не получаю ошибок.Поэтому вместо этого я получаю это:

while (data.moveToNext()) {

final String a = data.getString(1);
            final String b = data.getString(2);
            final String c = data.getString(3);
            final String d = data.getString(4);
            final String e = data.getString(5);
            final String f = data.getString(6);
            final String g = data.getString(7);
            final String h = data.getString(8);
            final String i = data.getString(9);
            final String j = data.getString(10);

    // Load the string request
    StringRequest stringRequest = new StringRequest(Request.Method.POST, serverUrl,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    if (!response.equals("false")) success = true;
                    else Toast.makeText(SendDataActivity.this, "False response.", Toast.LENGTH_SHORT).show();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(SendDataActivity.this, "An unknown error occurred.", Toast.LENGTH_SHORT).show();
                    error.printStackTrace();
                }
            }){

        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("key","###");
            params.put("a", a);
            params.put("b", b);
            params.put("c", c);
            params.put("d", d);
            params.put("e", e);
            params.put("f", f);
            params.put("g", g);
            params.put("h", h);
            params.put("i", i);
            params.put("j", j);
            return params;
        }
    };

    RequestHandler.getInstance(SendDataActivity.this).addToRequestQueue(stringRequest);

    // Remove the record from the SQLite if it worked
    if (success) {
        dbHelper.deleteRecord(data.getString(0));
        numRecords--;
        records.setText(Integer.toString(numRecords));
        success = false;
    }

}
...