【问题标题】:How to prevent duplicating SQLite database in android?如何防止在android中复制SQLite数据库?
【发布时间】:2012-01-21 14:32:26
【问题描述】:

我的应用程序读取 Internet 上的 XML 文件,记下时间并创建/写入 SQLite 数据库。下次需要数据时,如果时间大于 24 小时,则更新数据库(再次下载 xml)。

问题是,每当我在 AVD 中重新启动应用程序时,它都必须重新下载,所以我注意到数据库中的所有数据都被再次写入(重复)。所以我有 20 个(10+10 个重复项)而不是 10 个项目。如果我再次重新启动,我会再复制 10 个项目。

我考虑过如何防止数据库重复(或删除旧条目),因此我决定每次下载内容时都增加数据库版本。我认为这会触发 onUpgrade() 方法,因此数据将被清除但没有任何变化。

现在我一无所知。我该怎么办?

【问题讨论】:

  • 在将下载的数据提供给数据库之前,DELETE FROM MyTable 怎么样?我无法弄清楚实际问题是什么。为数据库方案升级(如果添加新表或列)进行版本更改。
  • 这正是我想要做的(并且已经做过)所以谢谢

标签: android sqlite duplicates


【解决方案1】:

在创建数据库时,您需要使用 UNIQUE 约束。您可能不想要我使用的 ON CONFLICT REPLACE,但您应该明白这一点。

例如:

private static final String DATABASE_CREATE_NEWS= "create table news (_id integer primary key autoincrement, "title text not null, description text not null, date text not null, LastModified text not null, UNIQUE(title, date) ON CONFLICT REPLACE);";

这是另一个关于它的可靠线程。 SQLite table constraint - unique on multiple columns

这里是关于 android sqlite 的更多信息:http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

【讨论】:

  • 感谢您提供的信息,这是我稍后在使用真实表格时会做的事情(不是这个测试用例)。
【解决方案2】:

您应该在代表唯一标识符的列上创建索引。

参见 SQLite 网站上的this article

CREATE INDEX ix_tblexample ON TableName ( Column1, Column2, Column3 [, Column4, etc..])

或者(根据您的评论)您可以将表格选择到光标中并检查每个表格。

String sql = "select * from " + tableName + "where column1 = " + param1 + "and column2 = " + param2;
Cursor cur = _db.rawQuery( sql, new String[0] );

if(cur.getCount() == 0)
{
    //upload
}

【讨论】:

  • 目前它是一个非常简单的表,包含 3 列用于测试目的,唯一标识符是 _id 字段。即使我要创建唯一标识符,重复项也会失败,但一开始就不应该创建它们——这就是我在这里试图避免的
  • 哦,是的,这是判断它是否为空的好方法,但这会阻止更新发生(我的数据库每 24 小时更新一次)。我做了@Knickedi 建议的操作,即在更新之前显式删除数据库并且它现在不会重复。还是谢谢。
  • @user1031312 啊,好吧。我不知道你不关心只保留特定的数据记录。但是,既然您不在乎,那么从 [TableName] 中删除是最好的方法。明白了。
猜你喜欢
  • 2018-12-29
  • 2016-07-23
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
相关资源
最近更新 更多