2013-09-08 7 views
0

У меня есть приложение, которое в начале получает данные из облака для обновления базы данных на телефоне пользователя. Я использую AsyncTask, который показывает ProgressDialog, пока он загружает данные. Проблема в том, что после загрузки данных база данных обновляется только в том случае, если я перезапускаю действие после того, как диалог исчезнет. Это отвратительно, и я хотел бы знать, есть ли лучший способ сделать это.Как обновить базу данных SQLite без перезапуска?

Вот AsyncTask:

class GetVersion extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(ListClubs.this); 
      pDialog.setMessage(getString(R.string.updating)); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show();  
     } 

    /** 
    * Getting product details in background thread 
    * */ 
    protected String doInBackground(String... params) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost updateCond = new HttpPost("http://website.com/update_db.php"); 
     //update database 
     List<NameValuePair> nameValuePairs2 = new ArrayList<NameValuePair>(); 
     nameValuePairs2.add(new BasicNameValuePair("version", Integer.toString(newVersion))); 
     try { 

        updateCond.setEntity(new UrlEncodedFormEntity(nameValuePairs2)); 
        HttpResponse response2 = httpclient.execute(updateCond); 
        String jsonResult2 = inputStreamToString(response2.getEntity().getContent()).toString(); 
        //saving the JSONObject 
        JSONObject object2 = new JSONObject(jsonResult2); 
        JSONArray conditions = object2.getJSONArray("conditions"); 
        //saving the version 
         for(int i = 0; i < conditions.length(); i++){ 
         JSONObject c = conditions.getJSONObject(i); 

         int condId = c.getInt("id"); 
         String condMon = c.getString("mon"); 

         db.updateCond(condId, condMon);    

        } 
        loginPrefsEditor.putBoolean("condBool", true); 
        loginPrefsEditor.commit();  
        Log.i("Update old version", Integer.toString(loginPreferences.getInt("oldV", -1))); 

     return null; 
    } 

    protected void onPostExecute(String file_url) { 
     // dismiss the dialog once got all details 

     pDialog.dismiss(); 
     restartActivity(); 

} } 

И это код updateCond:

public int updateCond(int id, String newCond) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 

     values.put(KEY_COND, newCond); 

     // updating row 
     return db.update(TABLE_COND, values, KEY_ID+"="+id,null); 
    } 
+0

Вы пытались выполнить обновление базы данных в 'onPostExecute'? В 'doInbackground' вы возвращаете' JSONObject' вместо String, а в 'onPostExecute' вы обрабатываете этот' JSONObject' и обновляете базу данных – jbihan

+0

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

ответ

0

Попробуйте сделать обновление базы данных в onPostExecute. В doInbackground вы возвращаете JSONObject вместо String, а в onPostExecute обрабатываете JSONObject и обновляете базу данных.