1

我想在后台线程中运行我的内容解析器操作(查询,插入,删除)。AsyncQueryHandler批量插入

我发现了AsyncQueryHandler可以解决我的问题。 AsyncQueryHandler的问题是:批量插入。我在我的应用程序中有这种操作,并且在AsyncQueryHandler类中没有要覆盖的bulkInsert方法。

我在处理AsyncQueryHandler时如何处理批量插入?除AsyncQueryHandler之外是否还有其他选项?

回答

0

在一天结束的时候,我改变了我的架构。

我删除了bulkInsert并对内容值数组进行了一次讨论。这样我就可以使用AsyncQueryHandler而没有问题。

经过思考和思考,我认为这对我来说是最好的选择。

1

嘿,你可以在这种情况下使用CursorLoader。这将查询内容解析器并返回一个游标。它使用AsyncTaskLoader在后台线程上执行游标查询,以便它不会阻塞应用程序的UI。 你可以看看http://www.theappguruz.com/blog/use-android-cursorloader-example了解更多详情。

而且你可以定义批量插入方法到您的内容提供商,如下面

@Override 
public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) { 
    //mOpenHelper is object of helper class. 
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 


      db.beginTransaction(); 
      int rowsInserted = 0; 
      try { 
       for (ContentValues value : values) { 

        long _id = db.insert(TABLE_NAME, null, value); 
        if (_id != -1) { 
         rowsInserted++; 
        } 
       } 
       db.setTransactionSuccessful(); 
      } finally { 
       db.endTransaction(); 
      } 

      if (rowsInserted > 0) { 
       getContext().getContentResolver().notifyChange(uri, null); 
      } 
      return rowsInserted; 


} 
+0

CursorLoader的问题是当我需要进行插入和删除操作时。我无法将它用于这些操作。 –

+0

你可以参考这个链接了解更多详情http://stackoverflow.com/questions/11131058/how-to-properly-insert-values-into-the-sqlite-database-using-contentproviders-i –

+0

我见过这个答案。这些人告诉使用“getContentResolver()。insert(Uri,ContentValues);”。问题是:这种插入进入主线程UI。我需要在后台线程上插入。 –

0

AsyncQueryHandler不支持bulkInsert可能是因为此方法不能保证插入的原子性。这是什么意思?那么,如果startInsert由于某种原因失败,那么没有插入完成。这意味着您可以进行无插入操作或进行一次插入操作。只有2个选项。保持原子性,即如果失败,则基础数据源保持与以前相同。

如果bulkInsert中的10个项目由于某种原因应该在中间失败,可以有很多选项:插入3个项目或插入5个项目。因此没有原子性。当ContentProvider不覆盖bulkInsert并最终多次使用隐含的insert时会发生这种情况。因此,插入每个项目后,交易将被视为成功并提交。这意味着对于10个项目,发生10个事务,并且如果任何一个发生故障,则不会回滚到数据源的先前状态。操作的原子性丢失。

但这是不好的。如果您拥有ContentProvider并且您已覆盖bulkInsert并确保保持原子性,该怎么办?那么你应该可以使用AsyncQueryHandler执行bulkInserthttps://github.com/Madrapps/AsyncQuery库确实如此。这是Android的相同AsyncQueryHandler,但支持bulkInsert

只要确保你使用自己的ContentProvider,如果你关心原子性,那么它可以处理bulkInsert