2011-12-04 47 views
5

我在將json數據存儲到sqlite時遇到問題。這是我現在試圖執行的代碼。 JSON數據不是特別大,只有40行。如何在SQLite中存儲JSON

主要活動是:

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

} 

適配器是:

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

我不知道在哪裏可以從這裏走的還是有問題。日誌貓顯示以下內容:

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 

最後,我想知道是否有人能幫助我調試在某種意義上說什麼,在哪裏放置相應的日誌記錄代碼,以便檢測其中的代碼是怎麼了?到底是什麼? 感謝

+0

您是否檢查過您的數據庫是否已創建? – Rakhita

+0

@Rakhita當應用程序打開但不工作時,我該如何去做這件事? – Hellboundz

+0

@Rakhita它似乎並沒有創建一個數據庫。你知道我能做什麼嗎? – Hellboundz

回答

6

爲了解決這個問題,你必須按照這個步驟

1)創建一個包含屬性按你的JSON數據的類。

2)將您的json數據反序列化到您的類中。 (映射JSON與類)

3)存儲到數據庫中的該類別的所有屬性的值(sqllite)(與數據庫映射類的)

4 ) ****保存你的工作***!

完成!享受Jsoning!

+2

感謝您的評論,我剛剛遇到與「05-12 06:25:27.851:E/AndroidRuntime(11152):java.lang.OutOfMemoryError:[內存耗盡] 」,當我試圖拉JSONObject退出表格。我猜它不喜歡所有的逗號和引號。我沒有嘗試過一個blob,但你的方式更有意義。 – tricknology