zvzej zvzej - 26 days ago 12
Android Question

How to transfer table from web to my database in Android

I'm making an application where I connect to a website to download a table from my web database in a json string, that I have done, in my app shows as a webArray. I have created a database helper class to create and edit my db inside the application, my problem is that I'm failing on transferring the data from my webArray to my db, here is some pieces of code maybe you could help pointing me on the right direction.

mainActivity:

//this is our download file asynctask
class DownloadFileAsync extends AsyncTask<String, String, String> {

@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS2);
}

@Override
protected String doInBackground(String... aurl) {

try {
String result = "";
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://mywebsite");
// httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
InputStream webs = entity.getContent();
// convert response to string
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(webs, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
webs.close();

result = sb.toString();
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
return "ERROR_IN_CODE";
}
} catch (Exception e) {
Log.e("log_tag", "Error in http connection " + e.toString());
return "ERROR_IN_CODE";
}

// parse json data
try {
JSONArray jArray = new JSONArray(result);
for (int i = 0; i < jArray.length(); i++) {
JSONObject json_data = jArray.getJSONObject(i);
webResultCuestionario resultRow3 = new webResultCuestionario();
resultRow3._id = json_data.getString("id");
resultRow3.pregunta = json_data.getString("Question");
resultRow3.respuesta = json_data.getString("Answer");
CuestionarioArray.add(resultRow3);
}
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
return "ERROR_IN_CODE";
}
} catch (Exception e) {
// this is the line of code that sends a real error message to the
// log
Log.e("ERROR", "ERROR IN CODE: " + e.toString());
// this is the line that prints out the location in
// the code where the error occurred.
e.printStackTrace();
return "ERROR_IN_CODE";
}
return null;
}

protected void onProgressUpdate(String... progress) {
Log.d(LOG_TAG,progress[0]);
mProgressDialog2.setProgress(Integer.parseInt(progress[0]));
}

@Override
protected void onPostExecute(String unused) {
//dismiss the dialog after the file was downloaded
dismissDialog(DIALOG_DOWNLOAD_PROGRESS2);
if(unused != null && unused.equals("ERROR_IN_CODE")){
errornote2();
}else{
tvCuestionario.setText("Cuestionario encontrado");
addCuestionarioToDb();
}
}
}

public void addCuestionarioToDb(){
for (webResultCuestionario currentItem: CuestionarioArray){
int cis = Integer.parseInt(currentItem._id);
db.insertCuestionario(CuestionarioArray.get(cis).pregunta, CuestionarioArray.get(cis).respuesta);
}
}


in my CuestionarioHelper Class:

public class CuestionarioHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME="cuestionario.db";
private static final int SCHEMA_VERSION=1;

public CuestionarioHelper(Context context) {
super(context, DATABASE_NAME, null, SCHEMA_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {

db.execSQL("CREATE TABLE Cuestionario (_id INTEGER PRIMARY KEY AUTOINCREMENT, pregunta TEXT, respuesta TEXT);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

public void insertCuestionario(String pregunta, String respuesta) {
ContentValues cv=new ContentValues();
cv.put("pregunta", pregunta);
cv.put("respuesta", respuesta);
getWritableDatabase().insert("Cuestionario", null, cv);
}


the log

09-23 16:23:02.977: E/AndroidRuntime(6496): FATAL EXCEPTION: main
09-23 16:23:02.977: E/AndroidRuntime(6496): java.lang.IndexOutOfBoundsException: Invalid index 100, size is 100
09-23 16:23:02.977: E/AndroidRuntime(6496): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
09-23 16:23:02.977: E/AndroidRuntime(6496): at java.util.ArrayList.get(ArrayList.java:304)
09-23 16:23:02.977: E/AndroidRuntime(6496): at VerCuestionarioEspanol_copy.MainActivity.addCuestionarioToDb(MainActivity.java:580)
09-23 16:23:02.977: E/AndroidRuntime(6496): at VerCuestionarioEspanol_copy.MainActivity$DownloadFile3Async.onPostExecute(MainActivity.java:46 2)
09-23 16:23:02.977: E/AndroidRuntime(6496): at VerCuestionarioEspanol_copy.MainActivity$DownloadFile3Async.onPostExecute(MainActivity.java:1)
09-23 16:23:02.977: E/AndroidRuntime(6496): at android.os.AsyncTask.finish(AsyncTask.java:602)
09-23 16:23:02.977: E/AndroidRuntime(6496): at android.os.AsyncTask.access$600(AsyncTask.java:156)
09-23 16:23:02.977: E/AndroidRuntime(6496): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
09-23 16:23:02.977: E/AndroidRuntime(6496): at android.os.Handler.dispatchMessage(Handler.java:99)
09-23 16:23:02.977: E/AndroidRuntime(6496): at android.os.Looper.loop(Looper.java:154)
09-23 16:23:02.977: E/AndroidRuntime(6496): at android.app.ActivityThread.main(ActivityThread.java:4977)
09-23 16:23:02.977: E/AndroidRuntime(6496): at java.lang.reflect.Method.invokeNative(Native Method)
09-23 16:23:02.977: E/AndroidRuntime(6496): at java.lang.reflect.Method.invoke(Method.java:511)
09-23 16:23:02.977: E/AndroidRuntime(6496): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-23 16:23:02.977: E/AndroidRuntime(6496): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-23 16:23:02.977: E/AndroidRuntime(6496): at dalvik.system.NativeStart.main(Native Method)

Answer

My solution as suggested by Luis was:

public void addCuestionarioToDb(){
  for (webResultCuestionario currentItem: CuestionarioArray){
    int cis = Integer.parseInt(currentItem._id)-1;   // just added the -1 here and runs perfect
    db.insertCuestionario(CuestionarioArray.get(cis).pregunta,  CuestionarioArray.get(cis).respuesta);
  }
}