2012-04-03 3 views
0

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

{"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, в котором я мог бы добавить метод или два, чтобы добавить вторую таблицу: ЭТС

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

} 

ответ

0

Вот решение, чтобы заставить PHP-скрипт корректно кодировать данные JSON. В настоящее время я все еще работаю над тем, как заставить Android разбирать его в JSONArray: https://stackoverflow.com/a/10019165/1231943

1

сделать getQuestionJSONFromUrl возвращаемую строку. Затем используйте эту строку, чтобы создать JSONObject и проанализировать ее. посмотрите на следующий пример.

+0

Это очень полезно и работает как рекламируется, но если метод getQuestion ... запускается только один раз, а 20 (произвольное число , иногда это будет больше, иногда это будет меньше) вопросов, которые возвращаются, как этот метод необходимо изменить, чтобы разместить 20 отдельных строк из SQL? – Davek804

+0

использовать цикл for для получения более одного раза, например for (int i = 0; i wolverine

+0

Я весь день работал над этим, и я до сих пор не могу заставить его работать. Лучшее, что я смог сделать, это обнаружить «} {« (конец/начало двух JSON) и поместить первую часть в строку и удалить вторую половину. Я обнаружил, что методов, которые мне нужны, не существует. – Davek804

1

Если ваш ответный контент больше, то используйте цикл для получения всех данных, просто следуйте приведенному ниже коду, надеясь, что он будет работать для вас.

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

} 
+0

Я вижу, как будет работать весь этот код, но у меня проблема. Как мне обойти: while ((line = reader.readLine())! = Null) {? Это естественная точка прерывания (пустое пространство) между двумя наборами {} {}, которые отображаются в выводе JSON с сервера. Как я могу кодировать способ хранения текущей строки, которая создается, а затем повторить цикл while, когда нуль остановит его до того, как он достигнет второй строки вывода? – Davek804

Смежные вопросы