如何在SQLite中存储JSON

时间:2011-12-04 12:48:09

标签: android database json sqlite parsing

我遇到了将JSON数据存储到sqlite的问题。这是我正在尝试实施的代码。 JSON数据不是特别大,只有40行。

主要活动是:

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

我不知道从哪里开始,因为仍有问题。日志cat显示以下内容:

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

最后,我想知道是否有人可以在某种意义上帮助我进行调试以及放置适当的日志代码以便检测代码出错的位置? 谢谢

1 个答案:

答案 0 :(得分:6)

要解决此问题,您必须遵循此步骤

1)根据您的json数据创建包含属性的类。

2)将您的json数据反序列化到您的班级。 (使用类映射json)

3)将该类中所有属性的值存储到数据库中( sqllite )(带数据库的类映射< / strong>)

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

完成!享受Jsoning !!