Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 哪个sqlite语句可以生成一个结果来指示重复的条目?安卓_Android_Sqlite_Insert_Return Value_Exists - Fatal编程技术网

Android 哪个sqlite语句可以生成一个结果来指示重复的条目?安卓

Android 哪个sqlite语句可以生成一个结果来指示重复的条目?安卓,android,sqlite,insert,return-value,exists,Android,Sqlite,Insert,Return Value,Exists,对于我的应用程序,我尝试在没有重复条目的情况下添加条目,如果有重复条目,请通知用户并让他重试。使用SQLite,我对它知之甚少,我尝试了这两种方法,想知道哪种方法更好、更高效,还是开发它的更好方法 第一种方式: db.execSQL("INSERT INTO " + DatabaseHelper.DATABASE_TABLE + "(LATITUDE, LONGITUDE, RATING) SELECT " + latitude + ", " + longitude + ", " + rati

对于我的应用程序,我尝试在没有重复条目的情况下添加条目,如果有重复条目,请通知用户并让他重试。使用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;
第一种方法是插入或忽略值,我通过这样做进行检查,在调用之前将行的行数存储到变量中,调用该函数,然后检查其结果。如果结果不高于调用前的值,则插入被忽略,用“values exist”消息提示用户。(我知道,非常草率,但绝望的时候需要采取绝望的措施)

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

我一直在反复尝试不同的方法,但我不知道如何设置SQLite以拥有唯一的对,有人告诉我这是最简单的。如果有人能纠正这些方法中的任何一种并/或对其进行评论,我们将不胜感激


谢谢

我理解您想要的是:拥有一个表数据库\u表(如果我可以这么说的话,这不是最具描述性的名称),它永远不会允许为两行输入相同的纬度和经度对

如果正确,则需要声明包含纬度和经度列的主键或唯一键。如果这样做,那么任何插入同一对的尝试都将抛出一个异常,您可以捕获该异常,从而通知用户。使用这种技术,您不需要在查询中使用WHERE not EXISTS(…)子句,只需执行一个简单的INSERT,并让SQLite提醒您违反了唯一性约束

如果您的表已经存在,则可以使用SQL命令轻松添加键。由于任何表上可能只有一个主键,因此如果表上已经有主键,则需要为此使用唯一键

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

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)

在我看来,使用原始lat/long并不是检查重复项的好方法。使用Android GeoPoint 1E6格式的每一种可能的纵横组合所覆盖的面积都不到5平方英寸。当然,这个尺寸是不同的,取决于你站在地球上的位置,但这是一个很好的经验法则。因此,你至少应该根据你想要测量的物体的大小,将你的lat/long四舍五入到最接近的十、百或千

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

lat = (lat/1000)*1000; 
lon = (lon/1000)*1000;
这里有一个很好的工具,用于计算地球上横向/纵向点之间的距离:


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

原因是,因为创建一个
唯一索引
对我来说似乎不起作用,而且无论这是我的还是SQLite的结果,对我来说都是一项困难的任务

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


我希望遇到这种情况的人能受到这里留下的答案的影响,并希望他们能比我幸运。

我的表实际上没有命名为Database_table,它是DatabaseHelper类中的一个字符串常量,我考虑过创建索引,但我有四个字段,我只希望其中两个字段是唯一的,我可以通过创建索引然后执行简单的插入或忽略来实现吗?如果是这样,SQLite将如何报告唯一性约束?提前谢谢。我知道如果字段是唯一的,我可以在字段上使用INSERT或IGNORE语句,这就是我的情况。我判断该值是被插入还是被忽略的方法是存储调用前的行数,并在调用后比较是否有任何注释?@Anthony:您创建的索引只包含两个要唯一的字段。您不需要计算行数并进行比较。不要使用或忽略,根据您使用事务的方式,使用中止(默认)或回滚。使用这种技术,您只能对数据库执行一个命令(INSERT),查看是否生成了错误SQLITE_约束。如果是,则尝试(但失败)插入重复的行。