2

对于我的应用程序,我正在尝试添加条目而没有重复条目,如果有重复项,请通知用户并让他重试。使用SQLite,对我知之甚少,这两种方式我都试过了,想知道哪一种更好,更高效,还是更好的开发方式?

第一种方式:

db.execSQL("INSERT INTO " + DatabaseHelper.DATABASE_TABLE + 
"(LATITUDE, LONGITUDE, RATING) SELECT " + latitude + ", " + longitude + ", " + rating +
" WHERE NOT EXISTS (SELECT 1 FROM " + DatabaseHelper.DATABASE_TABLE +
" WHERE LATITUDE = " + latitude + " AND LONGITUDE = " + longitude + ")");

第二种方式:

    long id = -1;
    try {
        id = db.compileStatement(
                "SELECT COUNT(*) FROM " + DatabaseHelper.DATABASE_TABLE
                        + " WHERE LATITUDE = " + latitude
                        + " AND LONGITUDE = " + longitude)
                .simpleQueryForLong();
    } catch (NullPointerException e) {
        return -1;
    }
    return id;

第一种方法是插入或忽略值,我这样做检查,在调用之前将行的行数存储到一个变量中,调用该函数,然后检查其结果。如果结果不高于调用前的结果,则插入被忽略,提示用户“值存在”消息。(非常草率,我知道,但绝望的时代需要绝望的措施)

第二种方式,返回与我要存储的数字匹配的实际行数,如果返回的数字大于 1,则使用“值存在”消息提示用户。

我一直在来回尝试不同的方法,但我不知道如何设置 SQLite 以拥有 UNIQUE 对,有人告诉我这将是最简单的。如果有人可以纠正这些方式中的任何一种和/或对它们发表评论,那将不胜感激。

谢谢

4

3 回答 3

3

这是我理解你想要的:拥有一个表 Database_Table (如果我可以这样说,不是最具描述性的名称),它永远不允许为两行输入相同的纬度和经度对。

如果正确,您希望声明包含纬度和经度列的 PRIMARY 或 UNIQUE KEY。如果您这样做,那么任何插入同一对的尝试都将引发异常,您可以捕获并通知用户。使用这种技术,您不需要在查询中使用 WHERE NOT EXISTS (...) 子句,只需执行简单的 INSERT 并让 SQLite 提醒您违反了 UNIQUEness 约束。

如果您的表已经存在,则可以使用 SQL 命令CREATE INDEX最轻松地添加键。由于您可能在任何表上只有一个 PRIMARY KEY,因此如果您已经在表上有一个 PRIMARY KEY,则需要为此目的使用一个 UNIQUE KEY。

您将使用的 CREATE INDEX 语句的最简单形式是:

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)
于 2009-10-28T02:02:05.417 回答
1

在我看来,使用原始纬度/经度并不是检查重复项的好方法。使用 Android 的 GeoPoint 1E6 格式的每个可能的纬度/经度组合覆盖的区域小于 5 平方英寸。当然,这个尺寸会根据你在地球上的位置而有所不同,但它是一个很好的经验法则。所以你至少应该根据你想要测量的东西的大小将你的纬度/经度四舍五入到最接近的十、百或千。

在将其存储到数据库之前:

lat = (lat/1000)*1000; 
lon = (lon/1000)*1000;

这是一个计算地球上纬度/经度点之间距离的好工具:

http://jan.ucc.nau.edu/~cvm/latlongdist.html

于 2009-10-28T16:45:42.577 回答
0

我决定采用第二种方法(见上文)

原因是因为创建一个UNIQUE INDEX似乎对我不起作用并且被证明对我来说是一项艰巨的任务,无论这是我的结果还是 SQLite 的结果。

它的目的不是微不足道的,方法可能是基本的,但它可以满足我的需要。

我希望遇到这种情况的人可以受到这里留下的答案的影响,并希望他们比我有更好的运气。

于 2010-02-02T17:06:35.610 回答