【问题标题】:inserting data in sqlite using batch operation in android使用android中的批处理操作在sqlite中插入数据
【发布时间】:2017-02-21 21:40:38
【问题描述】:

我正在使用改造从 Web 服务获取记录。获取记录不需要太多时间,但插入本地数据库需要几分钟。我尝试使用批处理操作插入它,但我没有观察到很大的不同。下面是我的网络服务响应和数据库插入方法。请检查我在哪里犯错。

 private void getResponseAndInsert(){

    progressDialog = createProgressDialog(getActivity(), false);
    progressDialog.show();
    final ContentServiceCall request = ServiceGenerator.createService(ContentServiceCall.class, "Empty");
    final Call<VODServiceResponse> call = request.getAllVODCategories(Constants.WS_VERSION,Constants.LOCAL_EN,Constants.PLATFORM);
    call.enqueue(new Callback<VODServiceResponse>() {
        @Override
        public void onResponse(Call<VODServiceResponse> call, final Response<VODServiceResponse> response) {

            if(response!=null && response.isSuccessful())
            {
                if(response.body()!=null && response.body().getResponse()!=null)
                {
                    if(response.body().getResponse().getResponseCode()== Constants.RESPONSE_CODE_SUCCESS)
                    {
                        if(response.body().getVODCategories() != null)
                        {
                            VODCategories vodCategories;
                            for (int i = 0; i < response.body().getVODCategories().size(); i++) {
                               //inserting in vod categories
                                vodCategories = response.body().getVODCategories().get(i);
                                dbHelper.insertVODCategories(vodCategories);
                            }
                        }
                        else {
                            // No data returned etc
                        }
                    }
                    else
                    {
                        //response.body().getResponse().getMessage() display in toast
                        //Toast.makeText(getActivity(),response.body().getResponse().getMessage(),Toast.LENGTH_LONG).show();
                    }

                }
                else
                {
                    // leave it
                }
            }
            else
            {
                // Display proper message
            }
            progressDialog.dismiss();
        }
        @Override
        public void onFailure(Call<VODServiceResponse> call, Throwable t) {
            Log.e("Fail", "Failure");
            if (progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            //Toast.makeText(getActivity(),"Please Check your Internet Connection ",Toast.LENGTH_LONG).show();

        }
    });
}

数据库插入方法

    public boolean insertVODCategories(VODCategories vd) {

    db = this.getWritableDatabase();
    db.beginTransaction();
    try {
        ContentValues initialValues = new ContentValues();
        initialValues.put(VODCATEGORIES_COLUMN_VODPARENTCATGORYID, vd.getVODParentCategoryId());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYID, vd.getVODCategoryId());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYNAME, vd.getVODCategoryName());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYTHUMBNAILPATH, vd.getVODCategoryThumbnailPath());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYIMAGEPATH, vd.getVODCategoryImagePath());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYIMAGEPATHLARGE, vd.getVODCategoryImagePathLarge());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYDESCRIPTION, vd.getVODCategoryDescription());
        initialValues.put(VODCATEGORIES_COLUMN_VODADDEDDATE, vd.getVODCategoryAddedDate());

        db.insert(TABLE_VODCATEGORIES, null, initialValues);
        db.setTransactionSuccessful();
    } finally {
        db.endTransaction();
        return true;

    }
}

【问题讨论】:

    标签: android sqlite bulkinsert


    【解决方案1】:

    您使用的批处理操作错误。您正在数据库事务中执行单个插入,这使事务无用。事务的重点是做多个操作。

    你可以这样做:

    List<VODCategories categories = response.body().getVODCategories();
    List<ContentValues> valuesList = new ArrayList<>();
    VODCategories vd;
    for (int i = 0; i < categories.size(); i++) {
       vd = categories.get(i);
       ContentValues initialValues = new ContentValues();
        initialValues.put(VODCATEGORIES_COLUMN_VODPARENTCATGORYID, vd.getVODParentCategoryId());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYID, vd.getVODCategoryId());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYNAME, vd.getVODCategoryName());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYTHUMBNAILPATH, vd.getVODCategoryThumbnailPath());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYIMAGEPATH, vd.getVODCategoryImagePath());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYIMAGEPATHLARGE, vd.getVODCategoryImagePathLarge());
        initialValues.put(VODCATEGORIES_COLUMN_VODCATEGORYDESCRIPTION, vd.getVODCategoryDescription());
        initialValues.put(VODCATEGORIES_COLUMN_VODADDEDDATE, vd.getVODCategoryAddedDate());
        valuesList.add(initialValues);
    }
    dbHelper.insertVODCategories(valuesList);
    

    为所有对象创建一个ContentValues 列表,然后

    public boolean insertVODCategories(List<ContentValues> values) {
    
        db = this.getWritableDatabase();
        db.beginTransaction();
        try {
            for(int i = 0; i < values.size(); i++) {
                db.insert(TABLE_VODCATEGORIES, null, values.get(i));
            }
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
            return true;
    
        }
    }
    

    在单个事务中插入所有这些值,这应该会更快。

    onResponse 也在主线程上执行。您可能希望在后台线程上执行 db 操作,以免阻塞 UI。

    【讨论】:

      猜你喜欢
      • 2011-12-08
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      相关资源
      最近更新 更多