Съхраняване на множество резултати от JSON

Може ли някой да предложи начин за модифициране на метода getQuestionJSONFromUrl() на JSONParser, така че да съхранява всеки въпрос като собствен обект в Android? Четене на множество резултати чрез PHP JSON връщане от SQL таблица, която изглежда така в браузър:

{"category":"elections","id":"0","title":"Who will you vote for in November's Presidential election?","published":"2012-04-02","enddate":"2012-04-30","responsetype":"0"}

{"category":"elections","id":"2","title":"Question title, ladies and gents","published":"2012-04-02","enddate":"2012-04-30","responsetype":"1"}

В момента резултатите дори не включват интервал между крайната скоба и началната скоба. Но мога да добавя към моя php: echo "\n"; и това ще ми даде интервал между двата реда, докато JSON чете. Така че това очевидно са два реда съдържание на пълнител за сега. В крайна сметка ще има истинско съдържание в тази SQL таблица.

Искам да мога да разделя тези редове на обекти (вероятно към моята локална SQLite db, предполагам?), така че да мога да ги използвам, за да покажа всеки като ред на таблица на екрана във фрагмент. Не съм много притеснен за аспекта на екрана, но привеждането на данните в работеща форма е проблем. В момента моят код съхранява само първия набор скоби като JSON обект. Ето целия съответен код:

public UserFunctions(){
    jsonParser = new JSONParser();
}

public JSONObject getQuestions(String category) {
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", question_tag));
    params.add(new BasicNameValuePair("category", category));
    JSONObject json = jsonParser.getQuestionJSONFromUrl(questionURL, params);
    return json;
}


public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static JSONObject[] jsonArray = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getQuestionJSONFromUrl(String url, List<NameValuePair> params) {

        // Making HTTP request
    try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                Log.v("while", line);
                sb.append(line + "\n");
                //Log.v("err", line);
            }
            is.close();
            json = sb.toString();


        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }

Може ли някой да предложи начин за модифициране на метода getQuestionJSONFromUrl() на JSONParser, така че да съхранява всеки въпрос като собствен обект в Android? Имам локална SQLite DB, в която мога да добавя метод или два за добавяне на втора таблица и т.н.:

package library;

import java.util.HashMap;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHandler extends SQLiteOpenHelper {

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "android_api";

    // Login table name
    private static final String TABLE_LOGIN = "login";

    // Login Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    public static final String KEY_EMAIL = "email";
    private static final String KEY_UID = "uid";
    private static final String KEY_CREATED_AT = "created_at";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "("
                + KEY_ID + " INTEGER PRIMARY KEY,"
                + KEY_NAME + " TEXT,"
                + KEY_EMAIL + " TEXT UNIQUE,"
                + KEY_UID + " TEXT,"
                + KEY_CREATED_AT + " TEXT" + ")";
        db.execSQL(CREATE_LOGIN_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN);

        // Create tables again
        onCreate(db);
    }

    /**
     * Storing user details in database
     * */
    public void addUser(String name, String email, String uid, String created_at) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, name); // Name
        values.put(KEY_EMAIL, email); // Email
        values.put(KEY_UID, uid); // Email
        values.put(KEY_CREATED_AT, created_at); // Created At

        // Inserting Row
        db.insert(TABLE_LOGIN, null, values);
        db.close(); // Closing database connection
    }

    /**
     * Getting user data from database
     * */
    public HashMap<String, String> getUserDetails(){
        HashMap<String,String> user = new HashMap<String,String>();
        String selectQuery = "SELECT  * FROM " + TABLE_LOGIN;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // Move to first row
        cursor.moveToFirst();
        if(cursor.getCount() > 0){
            user.put("name", cursor.getString(1));
            user.put("email", cursor.getString(2));
            user.put("uid", cursor.getString(3));
            user.put("created_at", cursor.getString(4));
        }
        cursor.close();
        db.close();
        // return user
        return user;
    }

    /**
     * Getting user login status
     * return true if rows are there in table
     * */
    public int getRowCount() {
        String countQuery = "SELECT  * FROM " + TABLE_LOGIN;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        int rowCount = cursor.getCount();
        db.close();
        cursor.close();

        // return row count
        return rowCount;
    }

    /**
     * Re crate database
     * Delete all tables and create them again
     * */
    public void resetTables(){
        SQLiteDatabase db = this.getWritableDatabase();
        // Delete All Rows
        db.delete(TABLE_LOGIN, null, null);
        db.close();
    }

}

person Davek804    schedule 03.04.2012    source източник


Отговори (3)


make getQuestionJSONFromUrl върнат низ. След това използвайте този низ, за ​​да създадете JSONObject и да го анализирате. вижте следния пример.

        JSONObject jsonobj=new JSONObject(str);
        String category=jsonobj.getString("category");
        String title=jsonobj.getString("title");
        int id=jsonobj.getInt("id");
        String published=jsonobj.getString("published");
        String enddate=jsonobj.getString("enddate");
        int responsetype=jsonobj.getInt("responsetype");
        System.out.println(category+" "+title +" "+id +" "+published +" "+enddate +" "+responsetype);
person Win Myo Htet    schedule 03.04.2012
comment
Това е много полезно и работи както се рекламира - но ако методът getQuestion... се изпълнява само веднъж и има 20 (произволен брой, понякога ще бъде повече, понякога ще бъде по-малко) въпроса, които се връщат, как работи методът трябва да промените, за да поберете 20 отделни реда от SQL? - person Davek804; 03.04.2012
comment
използвайте for цикъла за извличане повече от веднъж, като for(int i = 0; i‹Jsonarray.length(); i++); - person wolverine; 03.04.2012
comment
Прекарах цял ден в това и все още не мога да го накарам да работи. Най-доброто, което успях да направя, е да открия }{ (край/начало на два JSON) и да поставя първата част в низ и да изтрия втората половина. Откривам, че методите, от които бих се нуждаел, ги няма. - person Davek804; 04.04.2012

Ако вашият отговор съдържа повече резултат, тогава използвайте for цикъл, за да извлечете всички данни, просто следвайте кода по-долу, надяваме се, че ще работи за вас.

 JSONArray Arraylist = new JSONArray();
Arraylist=new JSONObject(output).getJSONObject("category").getJSONArray("title");

for (int i = 0; i < Arraylist.length(); i++)
{
    JSONObject headObject = Arraylist.getJSONObject(i);
    String  Question_title= headObject.optString("Question title");
    String published=headObject.optString("published");
    String enddate=headObject.optString("enddate");

}
person RobinHood    schedule 03.04.2012
comment
Виждам как ще работи целият този код, но имам проблем. Как да заобиколя: while ((line = reader.readLine()) != null) { ? Това е естествена точка на прекъсване (нулево пространство) между двата набора от {} {}, които се показват в JSON изхода от сървъра. Как мога да кодирам начин за съхраняване на текущия низ, който се прави, след което да повторя цикъла while, когато нула спре, преди да достигне втория ред на изхода? - person Davek804; 03.04.2012

Ето решението за това PHP скриптът да връща правилно кодирани JSON данни. В момента все още работя върху това как да накарам Android да го анализира в JSONArray: https://stackoverflow.com/a/10019165/1231943

person Davek804    schedule 04.04.2012