2013-03-04 106 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