2011-12-04 16 views
5

Si verificano problemi con l'archiviazione dei dati JSON in sqlite. Questo è il codice che sto cercando di implementare in questo momento. I dati JSON non sono particolarmente grandi con solo 40 linee in esso.Come memorizzare JSON in SQLite

L'attività principale è:

public class DatabaseActivity extends Activity { 
/** Called when the activity is first created. */ 

public DBAdapter 
DBAdapter =new DBAdapter(this); 

TextView txt; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
// Create a crude view - this should really be set via the layout resources 
// but since its an example saves declaring them in the XML. 
LinearLayout rootLayout = new LinearLayout(getApplicationContext()); 
txt = new TextView(getApplicationContext()); 
rootLayout.addView(txt); 
setContentView(rootLayout); 

// Set the text and call the connect function. 
txt.setText("Connecting..."); 
//call the method to run the data retreival 
txt.setText(getServerData(KEY_13)); 

} 

public static final String KEY_13 = "http://xxx.xxx.xxx/api/train.php"; 


private String getServerData(String returnString) { 

InputStream is = null; 

String result = ""; 
//the train line to send 
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
nameValuePairs.add(new BasicNameValuePair("code","A")); 

//http post 
try{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(KEY_13); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 

}catch(Exception e){ 
     Log.e("log_tag", "Error in http connection "+e.toString()); 
} 

//convert response to string 
try{ 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
     } 
     is.close(); 
     result=sb.toString(); 
}catch(Exception e){ 
     Log.e("log_tag", "Error converting result "+e.toString()); 
} 

//parse json data 
try{ 
     JSONArray jArray = new JSONArray(result); 
     for(int i=0;i<jArray.length();i++){ 
       JSONObject json_data = jArray.getJSONObject(i); 
       DBAdapter.insertTrain(json_data.getString("id"), 
            json_data.getString("code"), 
            json_data.getString("station"), 
            json_data.getString("platform"), 
            json_data.getString("timetillstation"), 
            json_data.getString("traindestination"), 

       //Get an output to the screen 
       returnString += "\n\t" + jArray.getJSONObject(i); 
     } 
}catch(JSONException e){ 
     Log.e("log_tag", "Error parsing data "+e.toString()); 
} 
return returnString; 
}  

} 

L'adattatore è:

public class DBAdapter{ 
public static final String KEY_ID = "id"; 
public static final String KEY_Code = "code"; 
public static final String KEY_Station = "station"; 
public static final String KEY_Platform = "platform"; 
public static final String KEY_TimeTillStation = "timetillstation"; 
public static final String KEY_TrainDestination = "traindestination"; 
private static final String TAG = "DBAdapter"; 

private static final String DATABASE_NAME = "trains"; 
private static final String DATABASE_TABLE = "Mekerel"; 
private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_CREATE = 
    "create table titles (id integer primary key, " 
    + "code text not null," 
    + "station text not null," 
    + "platform text not null," 
    + "timetillstation text not null," 
    + "traindestination text not null);"; 

private final Context context; 

private DatabaseHelper DBHelper; 
private SQLiteDatabase db; 
public DBAdapter(Context ctx) 
    { 
     this.context = ctx; 
     DBHelper = new DatabaseHelper(context); 
     this.db=DBHelper.getWritableDatabase(); 
    } 

private static class DatabaseHelper extends SQLiteOpenHelper 
{ 
    DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     db.execSQL(DATABASE_CREATE);  } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, 
    int newVersion) 
    { 
     Log.w(TAG, "Upgrading database from version " + oldVersion 
       + " to " 
       + newVersion + ", which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS titles"); 
     onCreate(db); 
    } 
}  

//---opens the database--- 
public DBAdapter open() throws SQLException 
{ 
    db = DBHelper.getWritableDatabase(); 
    return this; 
} 
//---closes the database---  
public void close() 
{ 
    DBHelper.close(); 
} 

//---insert a train into the database--- 
public long insertTrain(String id, String code, String station, String platform, String timetillstation, String traindestination) 
{ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_ID, id); 
    initialValues.put(KEY_Code, code); 
    initialValues.put(KEY_Station, station); 
    initialValues.put(KEY_Platform, platform); 
    initialValues.put(KEY_TimeTillStation, timetillstation); 
    initialValues.put(KEY_TrainDestination, traindestination); 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 
//---retrieves all the ttrain--- 
public Cursor getAllTrains() 
{ 
    return db.query(DATABASE_TABLE, new String[] { 
      KEY_ID, 
      KEY_Code, 
      KEY_Station, 
      KEY_Platform, 
      KEY_TimeTillStation, 
      KEY_TrainDestination}, 
      null, 
      null, 
      null, 
      null, 
      null, 
      null); 
} 
//---retrieves a particular train--- 
public Cursor getTrain(long id) throws SQLException 
{ 
    Cursor mCursor = 
      db.query(true, DATABASE_TABLE, new String[] { 
      KEY_ID, 
      KEY_Code, 
      KEY_Station, 
      KEY_Platform, 
      KEY_TimeTillStation, 
      KEY_TrainDestination}, 
     KEY_ID + "=" + id, 
     null, 
     null, 
     null, 
     null, 
     null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 
//---updates a train--- 
public boolean updateTrain(long id, String code, String station, String platform, String timetillstation, String traindestination) 
{ 
    ContentValues args = new ContentValues(); 
    args.put(KEY_Code, code); 
    args.put(KEY_Station, station); 
    args.put(KEY_Platform, platform); 
    args.put(KEY_TimeTillStation, timetillstation); 
    args.put(KEY_TrainDestination, traindestination); 
    return db.update(DATABASE_TABLE, args, 
        KEY_ID + "=" + id, null) > 0; 
} 
} 

non sono sicuro dove andare da qui in quanto vi sono ancora problemi. Il gatto di registro viene visualizzato il seguente:

12-04 12:43:09.691: E/AndroidRuntime(21334): FATAL EXCEPTION: main 
12-04 12:43:09.691: E/AndroidRuntime(21334): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{ta.dabase/ta.dabase.DatabaseActivity}: java.lang.NullPointerException 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1680) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.os.Looper.loop(Looper.java:130) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread.main(ActivityThread.java:3835) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at java.lang.reflect.Method.invokeNative(Native Method) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at java.lang.reflect.Method.invoke(Method.java:507) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at dalvik.system.NativeStart.main(Native Method) 
12-04 12:43:09.691: E/AndroidRuntime(21334): Caused by: java.lang.NullPointerException 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at ta.dabase.DBAdapter.<init>(DBAdapter.java:43) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at ta.dabase.DatabaseActivity.<init>(DatabaseActivity.java:32) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at java.lang.Class.newInstanceImpl(Native Method) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at java.lang.Class.newInstance(Class.java:1409) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1672) 
12-04 12:43:09.691: E/AndroidRuntime(21334): ... 11 more 

Infine, mi chiedevo se qualcuno mi potrebbe aiutare con il debug in un certo senso che cosa e dove posizionare il codice di registrazione appropriato in modo da rilevare in cui il codice che non va esattamente? Grazie

+0

hai controllato se il tuo database è stato creato? – Rakhita

+0

@Rakhita Come farei per farlo quando l'applicazione è aperta ma non funziona? – Hellboundz

+0

@Rakhita Sembra non creare un database. Hai idea di cosa posso fare? – Hellboundz

risposta

6

Per risolvere questo problema è necessario seguire questa passi

1) creare la classe che contiene proprietà secondo i vostri dati JSON.

2) Deserializzare i dati JSON nella classe. (Mappatura di JSON con classe)

3) memorizzare i valori di tutte le proprietà in quella classe in banca dati (SqlLite) (Mappatura della classe con il database)

4) **** Salva il tuo lavoro ***!

Fatto! Goditi Jsoning !!

+2

Grazie per questo commento, mi sono imbattuto in questo stesso tipo di errore con "05-12 06: 25: 27.851: E/AndroidRuntime (11152): java.lang.OutOfMemoryError: [memoria esaurita] " quando ho provato a tirare il JSONObject torna fuori dal tavolo. Suppongo che non piacciano tutte le virgole e le citazioni. Non ho provato un blob ma la tua strada ha più senso. – tricknology

Problemi correlati