2017-04-07 62 views
1

我正在開發一個應用程序,用戶輸入標題和日期。我想防止同一天輸入的重複標題進入數據庫。我正在檢查標題是否存在於選定的日期。然而,我的查詢似乎不工作,我不知道爲什麼,應用程序只是崩潰。這個查詢是否正確?有人可以幫忙嗎?Android SqlLite檢查兩個不同列中是否存在兩個值

public boolean checkExist(String title, String date) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor c = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+TITLE+"=?" +"AND" + DATE+"=?", new String[] {title,date}); 
    boolean exists = c.moveToFirst(); 
    c.close(); 
    return exists; 
} 
+0

它不起作用,怎麼樣?它失敗或者遊標沒有返回任何數據(即checkExist總是返回false)?如果失敗,則包括日誌。如果它返回的是數據,那麼我建議在'boolean exists = c.moveToFirst();'處放一個斷點,然後從調試器看看光標。特別是生成的查詢。 – MikeT

+0

應用程序崩潰 – doejogn

+1

請包括logcat。抱歉抱歉錯過了你說它崩潰了。呃估計這是從0行沿INDEX 1行的消息,因爲光標沒有行,你正在嘗試移動。您應該使用c.getCount()檢查遊標中的行數,如果大於0則返回true,否則返回false。 – MikeT

回答

1

的一個問題。

解決方法是不使用c.moveToFirst,而是獲取行數,然後相應地設置返回值。

例如

public boolean checkExist(String title, String date) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor c = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+TITLE+"=?" +"AND" + DATE+"=?", new String[] {title,date}); 
    boolean exists = c.getCount() > 0; 
    c.close(); 
    return exists; 
} 

的第二個問題是,查詢本身就是錯了,因爲你沒有關鍵字的空格兩側。也就是說,不是

Cursor c = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+TITLE+"=?" +"AND" + DATE+"=?", new String[] {title,date}); 

你應該有

Cursor c = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+TITLE+"=?" +" AND " + DATE+"=?", new String[] {title,date}); 

就個人而言,對於SQL關鍵字,包括空間,然後使用這些我安裝常量。所以我會沿着+TITLE+"=?" + SQLAND + DATE+"=?"的方向行事。在哪裏SQLAND將被定義爲沿線String SQLAND=" AND ";

PS看看Cricket_007的答案,代碼更整齊/更好,它更易於閱讀。

+0

你的空間也是關閉的 –

+0

[queryNumEntries()](https://developer.android.com/reference/android/database/DatabaseUtils.html#queryNumEntries(android.database.sqlite.SQLiteDatabase,%20java.lang.String, %20java.lang.String,%20java.lang.String []))會更簡單。 –

+0

無論我做什麼只是不斷壓碎 – doejogn

-1

你應該使用c.getCount()而不是c.moveToFirst()

如果該值大於0,那麼它的存在

+0

當人們接受你的答案時愛它,重新張貼一些更多的語言,然後downvote你的答案。 – buradd

0

您的間距是關閉的。 TITLE+"=?" +"AND" + DATE變成TITLE=?ANDDATE=?

我會建議這個。看到你的是,如果不存在匹配與您試圖移動到行中的空指針c.moveToFirst總是會失敗DatabaseUtils.queryNumEntries

public boolean checkExist(String title, String date) { 
    SQLiteDatabase db = getReadableDatabase(); 

    String[] args = new String[] {title,date}; 
    String filter = String.format("%s=? AND %s=?", TITLE, DATE); 

    return DatabaseUtils.queryNumEntries(db, TABLE_NAME, filter, args) > 0; 
} 
相關問題