2013-03-04 2 views
0

Я использую web service, который возвращает данные в формате JSON так:Как гарантировать, что данные вставляются только один раз в SQLite

{"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"}]} 

onCreate() из MainActivity.java является:

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

Теперь My logcat для запуска первого времени является:

enter image description here

и когда я повторно запустить приложение мой logcat является:

enter image description here

Теперь я хочу спросить, что это подходит правильно или нет, если YES! то я смогу обновить это позже! Спасибо!

+0

создайте таблицу ur с [УНИКАЛЬНОЕ ограничение] (http://www.sqlite.org/syntaxdiagrams.html#column-constraint), чтобы избежать дублирования вставки для столбцов –

+3

после вставки d ata в db хранить некоторый флаг в 'SharedPreferences', например, если он был успешно вставлен, затем хранить true в противном случае false и в oncreate Activity перед запросом данных с сервера проверять значение флажка SharedPreferences, если true означает, что нет необходимости запрашивать его снова или если false, тогда сделайте запрос server –

+0

Я пробовал много раз, но я не могу получить результат, если вы можете дать мне пример, пожалуйста! –

ответ

0

Вы верны, что этот код будет вставлять данные несколько раз. Вам будет нужно реализовать шаблон, который позволяет использовать только одну строку.

Вам необходимо либо сначала запросить источник данных, либо не вставлять данные, если они существуют, или вам нужно удалить данные из источника данных, а затем вставить их каждый раз. Существуют и другие шаблоны, но эти два будут наиболее распространенными. Какой из них вы выберете, будет зависеть от того, что данные и как вы хотите, чтобы он поддерживался или обновлялся.

+0

Первое спасибо за ваш ответ, теперь я хочу спросить, что это хорошая практика, что мы удаляем и вставляем данные снова и снова? это не повлияет на производительность приложения? –

+0

Это зависит от ваших данных.Если это одна строка редко обновляемых статических данных, тогда удаление/вставка гарантирует самую правильность. Если это большое количество строк смены данных, тогда удаление/вставка будет плохим выбором. В этом случае ваши данные должны иметь первичный ключ, и вы используете это для определения существования и обработки обновлений. Я бы посоветовал использовать подход, который записывает данные в один хранилище данных (например, SQLite), а затем использует что-то в другом хранилище данных (например, предпочтения), чтобы определить, было ли записано первое хранилище. Это может привести к реальным несоответствиям, если что-то осложнится. –

0
  1. определить столбец в таблице, чтобы быть primary key или unique
  2. использование SQLiteDatabase.insertWithOnConflict(...) с параметром conflictAlgorithm (последняя) установлен в `` SQLiteDatabase.CONFLICT_IGNORE`

См this

Смежные вопросы