2011-12-04 8 views
5

JSONデータをsqliteに格納する際に問題があります。これは今実装しようとしているコードです。 JSONデータは特に40行しかありません。JSiteをSQLiteに保存するには

主な活動は次のとおりです。

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:[memory exhausted] " JSONObjectをテーブルから戻します。私はすべてのカンマと引用が気に入らないと思っています。私はブロブを試していないが、あなたのやり方はもっと理にかなっている。 – tricknology