安卓SQLite插入唯一数据

4
简单的问题,但我找不到任何像样的文档。我已经创建了我的SQLite数据库,但它有两个问题或一个问题,这取决于你如何看待它!数据库创建良好,我可以在基本列表视图中显示数据,但是在更改手机/模拟器的方向时,插入语句会再次运行并重复所有记录。我猜这与所有代码都放置在OnCreate()方法中有关。然而,我的主要问题是如何进行INSERT UNIQUE或查询数据库以查看记录是否存在?我只能在Android平台上找到一些关于SQLite DB参数的文档。非常感谢您的帮助!祝贺你!
3个回答

6

SQLite有一个INSERT OR REPLACE命令(简称REPLACE,或使用SQLiteDatabase.replace())可以实现你想要的功能。

不过,我建议您的应用程序不应该在每次创建Activity时重新插入数据库,除非确实需要,因此您可能需要考虑更改设计。


2

首先,您需要解决屏幕方向变化的问题。在每次屏幕方向变化时访问数据库会消耗大量资源。

其次,关于检查重复记录的问题,您可以将列定义为唯一的,例如:

CREATE TABLE table_name(column_definition, unique(column_names) ON CONFLICT replace);` hen 

您可以像平常一样执行插入操作,数据库会确保不存在重复项。

1
这是最好的答案。独特性应该在模式级别处理,而不是在运行时使用额外的查询来处理。那只会增加更多的开销。 - hungryghost

2
你应该使用已经在Android SDK中的DatabaseUtils.stringForQuery()静态方法来轻松检索一个值,这个例子是为了String,但也有Long的方法。
stringForQuery(SQLiteDatabase db, String query, String[] selectionArgs)

实用方法,在数据库上运行查询并返回第一行第一列的值。
类似于:
String myString=DatabaseUtils.stringForQuery(getDB(),query,selectionArgs);

这个例子是获取一个字符串值,但你可以很容易地适应获取一个Long值,你的查询应该是类似这样的。
select count(*) from mytable where field1='stringtocheckagainst'

如果返回一个大于零的数字,则该字段已存在于数据库中。
此外,请查看处理方向更改的代码。
更新(由@nutone提供):
在API 11及以上版本中,您还可以使用DatabaseUtils.queryNumEntries函数直接获取(过滤后的)行数。
long count = DatabaseUtils.queryNumEntries(getDB(), table, query, selectionArgs);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接