gpt4 book ai didi

android - 遍历嵌套的 json 对象并将数据保存在 android sqlite 中

转载 作者:可可西里 更新时间:2023-11-01 07:39:52 27 4
gpt4 key购买 nike

我有一个嵌套的 JSON 对象,如下所示:

[
{
"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":[

]
}
]

从 mysql 服务器检索后,我尝试插入到 sqlite android 中,如下所示,它有效。唯一的问题是我似乎失去了每个问题与所有答案甚至 widget_id 之间的关系。因为一些问题有多个答案选项。

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);

}

我目前有一个表,其中包含代码中所见的所有列:

question_id、question_title、answer_id、answer_value 和 widget_id

我如何在来自 sqlite android 的 INSERTINGRETRIEVING 中保持每个问题之间存在于 json 对象中的关系,所有问题的答案和小部件 ID。

编辑

所以这是我现在得到的异常:

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)

还有一个

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)

编辑*从 mysql 服务器下载的 FragmentStatePagerActivity,将值传递给 PagerAdapter 然后加载 fragment *

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;
}

}

如您所见,这就是我在 doInBackground() 方法中打开它的方式然后我也在 pagerAdapter 类中打开它,因为它有 public ArrayList SelectAll() 方法,你刚刚在你的第二个答案中向我展示了这个方法。最后我在 TableAnswers 类和 TableQuestions 类中打开它作为好吧,因为我们要将数据插入数据库。

最佳答案

你必须创建两个表1)询问 parent 2)回答

1)问题表字段:

    auto_Id (primary Key) auto increment
question_id
description
widget_id

2)answer表字段:

   auto_Id (primary Key) auto increment
answer_text
answer_id
question_id

public void table_question{
//this functin is used for insert data .......when pass data from json
public void insert(Arraylist<Model_question> modelArrlist){

for (Model_question model : modelArrlist) {
ContentValues values = new ContentValues();
values.put(auto_Id, model.auto_Id);
values.put(question_id, model.question_id);
values.put(description, model.description);
values.put(widget_id, model.widget_id);
sqldb.insert(TableName, null, values);

for(Model_answer model_answer :model.arrAnswerList)
{
model_answer.question_id=model.question_id
Tbl_answer.insert(model_master);
}
}

}
}

//这是tbl_answer插入方法

public class tbl_answer{

public void insert(Model_answer model_answer){

ContentValues values = new ContentValues();
values.put(auto_Id, model.auto_Id);
values.put(question_id, model.question_id);
values.put(answer_text, model.answer_text);
values.put(answer_id, model.answer_id);

}
}


public void Model_question {

public String question_id,
description,
widget_id;
public List<Model_answer> arrAnswerList=new ArrayList<Model_answer>;
}

public void Model_answer{

public String answer_text,
answer_id,
question_id;

}

请检查此代码此代码将有助于将数据插入到两个表中..成功..

关于android - 遍历嵌套的 json 对象并将数据保存在 android sqlite 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21674637/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com