i have a nested JSON Object as follows :
[
{
"question_id":"1",
"description":"What is your gender ?",
"widget_id":"1",
"answers":[
{
"answer_text":"Male",
"answer_id":"1"
},
{
"answer_text":"Female",
"answer_id":"2"
}
]
},
{
"question_id":"2",
"description":"Which animal best describes your personality ?",
"widget_id":"2",
"answers":[
{
"answer_text":"Cat",
"answer_id":"3"
},
{
"answer_text":"Horse",
"answer_id":"4"
},
{
"answer_text":"Dove",
"answer_id":"5"
},
{
"answer_text":"Lion",
"answer_id":"6"
},
{
"answer_text":"Chameleon",
"answer_id":"7"
}
]
},
{
"question_id":"3",
"description":"Do you like meeting other people ?",
"widget_id":"3",
"answers":[
]
},
{
"question_id":"4",
"description":"On a scale of 1-10, how would you rate your sense of humour ?",
"widget_id":"4",
"answers":[
]
},
{
"question_id":"5",
"description":"Are you afraid of the dark ?",
"widget_id":"1",
"answers":[
{
"answer_text":"No",
"answer_id":"8"
},
{
"answer_text":"Yes",
"answer_id":"9"
}
]
},
{
"question_id":"6",
"description":"Is it true that cannibals do not eat clowns because they taste kind of funny ?",
"widget_id":"3",
"answers":[
]
},
{
"question_id":"7",
"description":"What is your email address ? (Optional)",
"widget_id":"3",
"answers":[
]
}
]
After retrieving from mysql server, i'm trying to insert into sqlite android as shown below, and it works.The only problem is i seem to lose the relationships between each question and all of it's answers and even widget_id.Because some questions have more than one answer option.
JSONArray aJson = new JSONArray(sJson);
ArrayList<Question> Question_Id_array = new ArrayList<Question>();
for (int i = 0; i < aJson.length(); i++) {
JSONObject json = aJson.getJSONObject(i);
Question que = new Question();
Question id = new Question();
que.setDescription(json.getString("description"));
id.setQuestionId(Integer.parseInt(json
.getString("question_id")));
que.setWidgetId((Integer.parseInt(json
.getString("widget_id"))));
JSONArray cJson = json.getJSONArray("answers");
ArrayList<Answer> ans = que.getAnswers();
for (int k = 0; k < cJson.length(); k++) {
JSONObject Objectjson = cJson.getJSONObject(k);
Answer answer = new Answer();
answer.setAnswer_Text(Objectjson
.getString("answer_text"));
answer.setAnswer_Id(Integer.parseInt(Objectjson
.getString("answer_id")));
ans.add(answer);
String answer_value = answer.getAnswer_Text()
.toString();
int answer_id = answer.getAnswer_Id();
String question_title = que.getDescription().toString();
int question_id = que.getQuestionId();
int widget_id = que.getWidgetId();
ContentValues cv = new ContentValues();
cv.put(ResponseDetails.KEY_QUESTION_ID,question_id);
cv.put(ResponseDetails.KEY_QUESTION_DESCRIPTION,question_title);
cv.put(ResponseDetails.ANSWER_ID, answer_id);
cv.put(ResponseDetails.KEY_ANSWER_VALUE,answer_value);
cv.put(ResponseDetails.WIDGET_ID, widget_id);
getApplicationContext().getContentResolver()
.insert(ResponseContentProvider.CONTENT_URI2, cv);
}
i currently have a single table with all the columns as seen in the code :
question_id,question_title,answer_id,answer_value and widget_id.
How can i maintain the relationship present in the json object between each question,all of it's answers and widget ID both while INSERTING and RETRIEVING from sqlite android.
EDIT
So this is now the exception i get:
02-11 15:44:33.487: E/AndroidRuntime(1336): FATAL EXCEPTION: main
02-11 15:44:33.487: E/AndroidRuntime(1336): java.lang.NullPointerException
02-11 15:44:33.487: E/AndroidRuntime(1336): at com.mabongar.survey.TableAnswers.insert(TableAnswers.java:53)
02-11 15:44:33.487: E/AndroidRuntime(1336): at com.mabongar.survey.FragmentStatePagerActivity$FetchQuestions.onPostExecute(FragmentStatePagerActivity.java: 177)
02-11 15:44:33.487: E/AndroidRuntime(1336): at com.mabongar.survey.FragmentStatePagerActivity$FetchQuestions.onPostExecute(FragmentStatePagerActivity.java: 1)
02-11 15:44:33.487: E/AndroidRuntime(1336): at android.os.AsyncTask.finish(AsyncTask.java:631)
02-11 15:44:33.487: E/AndroidRuntime(1336): at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-11 15:44:33.487: E/AndroidRuntime(1336): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
02-11 15:44:33.487: E/AndroidRuntime(1336): at android.os.Handler.dispatchMessage(Handler.java:99)
and another one
02-11 15:44:39.867: E/SQLiteLog(1357): (14) cannot open file at line 30191 of [00bb9c9ce4]
02-11 15:44:39.867: E/SQLiteLog(1357): (14) os_unix.c:30191: (2) open(/data/data/com.mabongar.survey/databases/responsetable.db) -
02-11 15:44:40.017: E/SQLiteDatabase(1357): Failed to open database '/data/data/com.mabongar.survey/databases/responsetable.db'.
02-11 15:44:40.017: E/SQLiteDatabase(1357): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
02-11 15:44:40.017: E/SQLiteDatabase(1357): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
EDIT *FragmentStatePagerActivity which downloads from mysql server,passes values to PagerAdapter which then loads the fragments*
public class FragmentStatePagerActivity extends ActionBarActivity {
public SQLiteDatabase db;
private final String DB_PATH = "/data/data/com.mabongar.survey/databases/";
private static final String DATABASE_NAME = "responsetable.db";
// AsyncTask Class
private class FetchQuestions extends AsyncTask<String, Void, String> {
@SuppressWarnings("static-access")
@Override
protected String doInBackground(String... params) {
if (params == null)
return null;
try{
String mPath = DB_PATH + DATABASE_NAME;
db = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CONFLICT_NONE);
}catch(SQLException e){
Log.e("Error ", "while opening database");
e.printStackTrace();
}
// // get url from params
String url = params[0];
try {
// create http connection
HttpClient client = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
// connect
HttpResponse response = client.execute(httpget);
// get response
HttpEntity entity = response.getEntity();
if (entity == null) {
return null;
}
// we get response content and convert it to json string
InputStream is = entity.getContent();
return streamToString(is);
} catch (IOException e) {
Log.e("Log message", "No network connection");
}
return null;
}
}
As you can see,that is how i open it in the doInBackground() method Then i also open it in the pagerAdapter class,because it has the public ArrayList SelectAll() method which you just showed me in youe second answer.And finally i open it in the TableAnswers class and TableQuestions class as well because we're inserting data into the database.