2009-10-28 12 views
2

對於我的應用程序,我試圖在沒有重複條目的情況下添加條目,並且如果有重複通知用戶並讓他再試一次。使用我非常瞭解的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對,我被告知會是最簡單的。如果任何人都可以改正這些方式和/或評論他們,那將不勝感激。

感謝

回答

0

我已經決定去與我的第二種方法(見上文)

原因是因爲創建一個UNIQUE INDEX似乎並不爲我和省工作對我來說,完成這個任務無論是我的還是SQLite的結果都是一項艱鉅的任務。

它的目的是不平凡的,方法可能是基本的,但它做什麼,我需要做的。

我希望人們遇到的情況一樣,這可以通過在這裏留下答案的影響,並希望他們有更好的運氣比我早。

3

這裏就是我理解你想要的:爲了有一個表Database_Table(不是最描述性的名稱,如果我可以這樣說),這將永遠不會允許兩行中輸入相同的緯度和經度對。

如果正確,您希望聲明合併列緯度和經度的PRIMARY或UNIQUE KEY。如果你這樣做,那麼任何嘗試插入同一對將會拋出一個異常,你可以捕獲並從而通知用戶。使用這種技術,您不需要在查詢中使用WHERE NOT EXISTS(...)子句,只需執行普通INSERT並讓SQLite提醒您違反UNIQUEITY約束。

如果您的表已經存在,則可以使用SQL命令CREATE INDEX輕鬆添加密鑰。由於您可能在任何表上只有一個PRIMARY KEY,如果您已經在表上有PRIMARY KEY,則需要使用UNIQUE KEY來達到此目的。

你可以使用CREATE INDEX語句的最簡單形式是:

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude) 
+0

我的表是不實際命名Database_Table,其字符串常量在我DatabaseHelper課,我曾想過創建索引,但我有四個領域,我想只有他們兩個獨特的,我可以這樣做的CREATE INDEX然後只是執行一個簡單的INSERT或IGNORE?如果是這種情況,SQLite將如何報告UNIQUEITY約束?提前致謝。 – 2009-10-28 02:06:57

+0

我知道我可以使用插入或域忽略聲明,如果他們是獨一無二的,這是我的情況。我的方法是告訴這個值是插入還是忽略,是在調用之前存儲行數,然後再比較,對此有何評論? – 2009-10-28 02:15:26

+2

@Anthony:您可以創建只包括你想成爲唯一的兩個字段的索引。您不需要對行進行計數並進行比較。並且不要使用OR IGNORE,根據您使用的交易方式,使用ABORT(默認)或ROLLBACK。使用這種技術,您只需對數據庫執行一個命令(INSERT),查看是否生成了錯誤SQLITE_CONSTRAINT。如果是,則嘗試(並失敗)插入重複行。 – 2009-10-28 02:24:23

1

它是使用原始緯度/長在我看來,是不是重複檢查的好方法。使用Android的GeoPoint 1E6格式的每種可能的經緯度組合都涵蓋了小於5平方英寸的面積。當然,這個大小根據你站在地球上的不同而不同,但它是一個非常好的經驗法則。所以你應該至少將你的緯度/長度舍入到最接近的十,一百或者一千,這取決於你想要測量的東西的大小。

之前,你把它存儲在數據庫中:

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

這裏是地球上計算經/緯度點之間的距離的好工具:

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

相關問題