对于我的应用程序,我试图在没有重复条目的情况下添加条目,如果有重复通知用户并让他再试一次。使用我非常了解的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对,我被告知这将是最简单的。如果有人能够纠正这些方式中的任何一种和/或对它们发表评论,那将非常感激。

由于

有帮助吗?

解决方案 3

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

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

它的目的不是微不足道的,方法可能是基本的,但它做了我需要它做的事情。

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

其他提示

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

如果正确,您要声明包含纬度和经度列的PRIMARY或UNIQUE KEY。如果你这样做,那么任何INSERT同一对的尝试都会引发异常,你可以捕获它,从而通知用户。使用这种技术,您不需要在查询中使用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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top