對於我的應用程序,我試圖在沒有重複條目的情況下添加條目,並且如果有重複通知用戶並讓他再試一次。使用我非常瞭解的SQLite,我已經嘗試了這兩種方法,並想知道哪一個更好,更高效或更好的開發方法?哪個sqlite語句可以產生一個結果來表示重複條目? Android
第一方式:
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對,我被告知會是最簡單的。如果任何人都可以改正這些方式和/或評論他們,那將不勝感激。
感謝
我的表是不實際命名Database_Table,其字符串常量在我DatabaseHelper課,我曾想過創建索引,但我有四個領域,我想只有他們兩個獨特的,我可以這樣做的CREATE INDEX然後只是執行一個簡單的INSERT或IGNORE?如果是這種情況,SQLite將如何報告UNIQUEITY約束?提前致謝。 – 2009-10-28 02:06:57
我知道我可以使用插入或域忽略聲明,如果他們是獨一無二的,這是我的情況。我的方法是告訴這個值是插入還是忽略,是在調用之前存儲行數,然後再比較,對此有何評論? – 2009-10-28 02:15:26
@Anthony:您可以創建只包括你想成爲唯一的兩個字段的索引。您不需要對行進行計數並進行比較。並且不要使用OR IGNORE,根據您使用的交易方式,使用ABORT(默認)或ROLLBACK。使用這種技術,您只需對數據庫執行一個命令(INSERT),查看是否生成了錯誤SQLITE_CONSTRAINT。如果是,則嘗試(並失敗)插入重複行。 – 2009-10-28 02:24:23