android把json存入sqlite,迭代嵌套的json对象并在android sqlite中保存数据

我有一个嵌套的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_Id_array = new ArrayList();

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 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进行INSERTING和RETRIEVING时,如何在每个问题,所有答案和小部件ID之间维护json对象中存在的关系.

编辑

所以这是我得到的例外:

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然后加载片段*

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 {

@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类中打开它,因为它有公共的ArrayList SelectAll()方法,你刚才给我看了第二个答案.最后我在TableAnswers类和TableQuestions类中打开它,因为我们正在插入数据进入数据库.

解决方法:

你必须创建两个表

1)质疑父母

2)答案

1)问题表字段:

auto_Id (primary Key) auto increment

question_id

description

widget_id

2)回答表字段:

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 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 arrAnswerList=new ArrayList;

}

public void Model_answer{

public String answer_text,

answer_id,

question_id;

}

请检查此代码,此代码将有用于将数据插入两个表…成功..

标签:json,mysql,android,sqlite

来源: https://codeday.me/bug/20190708/1406195.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值