在SQLite数据库上安全地插入数据

时间:2014-05-17 23:07:50

标签: android android-asynctask android-sqlite android-contentprovider android-cursorloader

我需要在SplashScreenActivity的表中加载来自服务的数据。我已经关注了this教程,一切正常。我还添加了一个自定义的AsyncTask来在后台运行插入循环。

问题是,如果在插入过程中发生配置更改(例如屏幕旋转),一切都会爆炸,并且我会在数据库中保存损坏的数据。

我已经阅读了有关CursorLoader的内容,但这只是用于查询数据库的内容。我也看过ContentProviders,但他们没有解决问题。

有关如何处理此问题的任何想法?

我基本上需要的是:

  1. 从后台线程访问数据库以保持UI响应。
  2. 在数据库上执行插入时处理配置更改。
  3. 更新:

    public class SplashScreenActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);
    
        ...
    
        // Create a Volley Request and fetch data
    }
    

    当我得到Response对象时,我启动了AsyncTask:

        new Response.Listener<JSONObject>() {
    
        @Override
        public void onResponse(JSONObject response) {
            if (response.optString("lastrunstatus").equals(
                    "success")) {
    
                JSONObject results = response
                        .optJSONObject("results");
                JSONArray objects = results
                        .optJSONArray("objects");
    
                new HandleResponseAsyncTask().execute(objects);
            }
        }
    

    在AsyntTask中,我插入所有对象:

        private class HandleResponseAsyncTask extends
            AsyncTask<JSONArray, String, Void> {
    
        @Override
        protected void onPreExecute() {
            mDataSource.open();
        }
    
        @Override
        protected Void doInBackground(JSONArray... params) {
            publishProgress("Deleting data...");
            mProductosDataSource.deleteAll();
    
            publishProgress("Saving data...");
            JSONArray objects = params[0];
            for (int i = 0; i < objects.length(); i++) {
                JSONObject object = objects.optJSONObject(i);
                // Get each column value from JSON
                ...
                mDataSource.insert(id, name, description);
            }
    
            return null;
        }
    
        @Override
        protected void onProgressUpdate(String... messages) {
            mTextViewLoading.setText(messages[0]);
        }
    
        @Override
        protected void onPostExecute(Void result) {
            mDataSource.close();
    
            // Go to main
            startMainActivity();
        }
    }
    

    注意:mDataSource包含一个辅助类的实例,该类调用自定义SQLiteOpenHelper类中的方法。

0 个答案:

没有答案