【问题标题】:Prevent re-inserting data into Database Tables [Android]防止将数据重新插入数据库表 [Android]
【发布时间】:2015-12-03 13:16:51
【问题描述】:

现在,我正在处理一个涉及从 MovieDB 获取电影数据的项目。我使用 Schematic 作为我的内容提供程序生成器,以避免制作一个令人头疼的问题。到目前为止工作正常。

我在这里要问的问题是我的代码的结构。现在,包含 AsyncTask 的片段调用任务来获取数据,每次应用加载 MainActivity 时都会调用该任务。数据被提取并插入到数据库表中;游标不返回 null 并获取我存储的数据。但是,我遇到了我认为是我再次获取数据并将其存储到同一个数据库中的问题。如果我加载到 DetailActivity、SettingsActivity 或任何其他从 MainActivity 导航但将通过后退按钮返回到它的 Activity,就会发生这种情况。

日志语句似乎显示我的数据再次重新插入,导致同一个数据库表中的相同条目重复等等。我可以想到一些临时解决方案,其中之一是在启动应用程序时删除获取数据的调用,而不是通过使用操作栏上的刷新按钮来获取数据。另一个可能是使表的列唯一,特别是保存 youtube 视频密钥的 youtube 视频密钥字符串。我现在仍然不确定该怎么做。

我将不胜感激任何解决方案。谢谢。

【问题讨论】:

  • 你不能set your entry UNIQUE 吗?
  • 在此之后我会在睡前醒来后尝试一下。由于我的表格的设置方式,当同一部电影具有多个视频链接时,它们存在多个条目。我将假设 Youtube 视频键(URI 中 watch 查询参数后的 #)是唯一的。
  • 不,试过了。将约束设置为唯一会使应用在尝试重新插入时崩溃
  • 重新插入前需要检查是否已经存在...

标签: android sql database android-contentprovider


【解决方案1】:

添加UniquePrimary 键和replace 作为冲突解决方案。

类似的东西

@DataType(DataType.Type.INTEGER)
@PrimaryKey(onConflict = ConflictResolutionType.REPLACE)
String UNIQUE_COLUMN = "unique_column";

它适用于@PrimaryKey@Unique@Check。更多信息可以在 Schematic's JavaDoc 和 SQlite 的 ON CONFLICT 文档中找到。

有一些限制:

  • 如果存在多个@PrimaryKey,原理图将忽略onConflict
  • 分辨率Replace 将替换插入中提供的行中的所有列,而不仅仅是列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2016-03-20
    • 1970-01-01
    • 2012-01-06
    • 2014-07-21
    相关资源
    最近更新 更多