【问题标题】:How to store JSON in SQLite如何在 SQLite 中存储 JSON
【发布时间】:2012-01-12 14:34:16
【问题描述】:

我在将 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;
}
}

我不知道从哪里开始,因为仍然存在问题。日志猫显示如下:

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

最后,我想知道是否有人可以在某种意义上帮助我调试什么以及在哪里放置适当的日志记录代码,以便准确检测代码哪里出错了? 谢谢

【问题讨论】:

  • 你检查过你的数据库是否已经创建了吗?
  • @Rakhita 当应用程序打开但不工作时,我该怎么做?
  • @Rakhita 它似乎没有创建数据库。你知道我能做什么吗?
  • 根据json要求创建一个类!尝试将此类与您的特定数据库表进行映射!并将您的 JSON 字符串反序列化到您的类中! stackoverflow.com/questions/9110264/…
  • @Hellboundz 它在 c# 中,但你可以知道这个想法并将其实现到 android (Java) 中

标签: android database json sqlite parsing


【解决方案1】:

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

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

2) 将您的 json 数据反序列化到您的类中。 (json与类的映射)

3) 将该类中所有属性的值存储到数据库中(sqllite)(类与数据库的映射)

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

完成!享受 Jsoning !

【讨论】:

  • 感谢您的评论,我刚刚遇到了与“05-12 06:25:27.851: E/AndroidRuntime(11152): java.lang.OutOfMemoryError: [内存耗尽] 相同类型的错误” " 当我试图将 JSONObject 拉出表格时。我猜它不喜欢所有的逗号和引号。我没有尝试过 blob,但你的方法更有意义。
猜你喜欢
  • 2022-01-24
  • 2019-07-18
  • 2013-04-22
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多