【问题标题】:Android - How to use transactions when modifying database via ContentProvider?Android - 通过 ContentProvider 修改数据库时如何使用事务?
【发布时间】:2016-03-01 18:05:28
【问题描述】:

当用户点击他们的 NFC 标签时,我的应用:

  1. users表中插入一个新用户,取回用户_id,然后
  2. 将此_id 值写入用户的NFC 标签。

问题在于,如果该用户将其标签移开太快,则第 2 步将失败并显示IOException。然后用户将不得不再次点击他们的标签,但这将导致重复第 1 步 - 即重复条目。 :-/

为了克服这个问题,我想使用基于this example code from the API documentation的事务:

   db.beginTransaction();
   try {
     // Insert data into database, getting back _id
     // Write _id to NFC tag
     db.setTransactionSuccessful();
   } finally {
     db.endTransaction();
   }

...但是我的数据库包含在MyContentProvider 中,所以我无权访问db

有没有办法在插入数据时使用事务而不放弃MyContentProvider的使用?

【问题讨论】:

  • 不要使用自动生成的_id ...使用不同的东西,比如guid
  • 谢谢。如果无法实现所需的解决方案。我会考虑的。 (删除插入的行也是一种选择,但显然远非理想)。

标签: android sqlite transactions android-contentprovider android-database


【解决方案1】:

您可以反转操作:您可以查询数据库以获得下一个可用 ID,将 ID 写入 NFC 标签,然后如果您成功更新 NFC 标签,则使用该 ID 更新数据库。

【讨论】:

  • 感谢您的建议,但是(如何)可以通过内容提供商获得下一个可用 ID?
  • 您可以通过ID查询您的内容提供者,并按降序排序。 contentProvider.query(uri, new String[] {"_id"}, null, null, "_id DESC");获取光标中的第一个条目,然后将 ID 加一。您也可以在查询中使用 LIMIT 来仅提取 1 个条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多