Я пытаюсь разработать приложение, которое хранит данные локально в базе данных 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();