2013-03-04 33 views
0

只有一次我使用的是web serviceJSON格式返回的數據是這樣的:如何確保數據插入源碼

{"content":[{"id":"1","asset_id":"62","title":"sample page","alias":"","introtext":"","fulltext":"Some Contents"},{"id":"2","asset_id":"62","title":"sample page2","alias":"","introtext":"","fulltext":"Some Contents"},{"id":"3","asset_id":"62","title":"sample page3","alias":"","introtext":"","fulltext":"Some Contents"}]} 

MainActivity.javaonCreate()是:

boolean myFlag = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);  
    textView = (TextView) findViewById(R.id.myView); 

    setFlag = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); 

    dataSource = new ContentsDataSource(this); 
    dataSource.open(); 
    parseAndIsertData(); 

} 

parseAndInsertData()是:

EDIT

現在
private void parseAndIsertData() { 
    // Creating JSON Parser instance 
    MyJSONParser jParser = new MyJSONParser(); 

    contentDataObject = new ContentDataObject();   
    // getting JSON string from URL 
    JSONObject json = jParser.getJSONFromUrl(BASE_URL); 

    try { 
     // first time check if data is inserted 
     editor = setFlag.edit(); 
     editor.putBoolean(MY_KEY, true);    

     // Getting Array of Contents 
     jsonArray = json.getJSONArray(MOBILE_CONTENT);   
     // looping through All Contents 

     if(!myFlag){    

      for(int i = 0; i < jsonArray.length(); i++){ 

       contentDataObject.setId(jsonArray.getJSONObject(i).getInt(MOBILE_CONTENT_ID)); 
       contentDataObject.setTitle(jsonArray.getJSONObject(i).getString(MOBILE_CONTENT_TITLE)); 
       contentDataObject.setFulltext(jsonArray.getJSONObject(i).getString(MOBILE_CONTENT_FULLTEXT)); 
       contentDataObject.setState(jsonArray.getJSONObject(i).getInt(MOBILE_CONTENT_STATE)); 
       contentDataObject.setNewValue(jsonArray.getJSONObject(i).getInt(MOBILE_CONTENT_NEW)); 
       contentDataObject.setHeader(jsonArray.getJSONObject(i).getString(MOBILE_CONTENT_HEADER)); 
       contentDataObject.setColor(jsonArray.getJSONObject(i).getInt(MOBILE_CONTENT_COLOR)); 
       contentDataObject.setNext(jsonArray.getJSONObject(i).getString(MOBILE_CONTENT_NEXT)); 
       contentDataObject.setPrevious(jsonArray.getJSONObject(i).getString(MOBILE_CONTENT_PREVIOUS)); 

       contentDataObject = dataSource.create(contentDataObject); 

       Log.i(MY_TAGT, "Data Inserted " + contentDataObject.getId() + " Times"); 

      } 

      myFlag = setFlag.getBoolean(MY_KEY, false); 

     } 


    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
}} 

首次推出我的logcat是:

enter image description here

,當我重新啓動應用程序我logcat是:

enter image description here

現在我想問問這是本方法正確與否如果YES!那麼我將能夠在以後更新! 謝謝!

+0

使用[UNIQUE約束](http://www.sqlite.org/syntaxdiagrams.html#column-constraint)創建ur表,以避免在插入d後重復插入列 – 2013-03-04 17:56:38

+3

ata in db在'SharedPreferences'中存儲了一些標誌,就像如果成功插入一樣,然後存儲true否則爲false,並且在從服務器請求數據之前存儲true的Activity的oncreate中檢查SharedPreferences標誌值,如果爲true,則表示不需要再次請求或者如果爲false,則請求服務器 – 2013-03-04 18:02:44

+0

我已經嘗試了很多次,但是如果你可以給我一些例子,我不能得到結果! – 2013-03-05 15:50:16

回答

0

你是對的,這段代碼會多次插入數據。實現只允許一行的模式將由您決定。

您需要首先查詢數據源,如果數據存在,則不要插入數據,或者需要從數據源中刪除數據,然後每次插入數據。還有其他模式,但這兩個將是最常見的。您選擇哪一個取決於數據是什麼以及您希望如何維護或更新。

+0

首先感謝您的回答,現在我想要要問我們是否一次又一次地刪除和插入數據是一種好的做法?這會不會影響App的性能? – 2013-03-05 05:10:38

+0

這取決於你的數據。如果這是不常更新的靜態數據的一行,則刪除/插入可以保證最正確的數據。如果這是大量不斷變化的數據行,那麼刪除/插入將是一個不錯的選擇。在這種情況下,你的數據應該有一個主鍵,並用它來確定存在並處理更新。 我建議不要將數據寫入一個數據存儲(如SQLite),然後在另一個數據存儲(如首選項)中使用某些方法來確定是否寫入第一個存儲。如果任何事情變得複雜,這可能導致真正的不匹配。 – 2013-03-08 18:39:24

0
  1. 在表中定義列是primary keyunique
  2. 使用SQLiteDatabase.insertWithOnConflict(...)conflictAlgorithm參數(最後一個)設置爲``SQLiteDatabase.CONFLICT_IGNORE`

this