2013-03-29 63 views
14

我知道有一個SQL命令如下所示:IF NOT EXISTS,但由於Android的SQLiteDatabase類有一些很好的方法,所以我想知道是否有可能如果通過方法不存在,則插入一個值。SQLiteDatabase:僅當值不存在時插入(不通過原始SQL命令)

目前我使用這個插入String

public long insertString(String key, String value) { 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(key, value); 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 

dbSQLiteDatabase一個實例)

我試過方法insertOrThrow()而不是insert(),但似乎它的與insert()相同。也就是說,如果該值已在行中,則會再次插入該行,以便該行現在具有兩個具有相同值的值。

+1

你爲什麼不使你的關鍵獨特之處? –

+0

您可以使用ORM庫。 我已經使用ORMDroid,你可以通過方法做一些SQL查詢。 http://ormlite.com/sqlite_java_android_orm.shtml – dannyroa

回答

14

SQLiteDatabase:插入只有當值不存在(通過原始 SQL命令不)

既然你不想使用原始的查詢就可以實現它,在插入之前,剛剛創建一些函數將測試值是否已經存在於數據庫中。它可以返回boolean(或int),如果它返回false,你將執行插入查詢。

一個小例子:

public int getCount() { 
    Cursor c = null; 
    try { 
     db = Dbhelper.getReadableDatabase(); 
     String query = "select count(*) from TableName where name = ?"; 
     c = db.rawQuery(query, new String[] {name}); 
     if (c.moveToFirst()) { 
      return c.getInt(0); 
     } 
     return 0; 
    } 
    finally { 
     if (c != null) { 
      c.close(); 
     } 
     if (db != null) { 
      db.close(); 
     } 
    } 
} 

if (getCount() == 0) { 
    //perform inserting 
} 

如果值已經是行中,它再次插入,該行現在 具有相同的值的兩個值。

這可以通過使用適當的約束來解決,這將不允許您插入重複項。檢查:

+1

感謝男人,我通過約束解決了它:) – eightx2

+0

@ eightx2歡迎您:) – Sajmon

+0

建議如何使用約束,而不是在嵌入之前使用約束條件?我正在測試約束,我注意到正在打印到控制檯的堆棧跟蹤由於約束無法插入,這會影響任何東西嗎?應用程序沒有崩潰,沒有注意到性能下降,只是想知道。 – OmarBizreh

3

有兩種基本的方法可以做到這一點:

  1. 查詢數據庫。手動檢查數據是否已經存在,如果不存在則添加。
  2. 使用CONSTRAINTs。定義您的SQL模式以僅允許此列的唯一數據。

如果您想要在不同情況下執行不同的操作(或者您不熟悉SQL),則第一種方法更容易。第二種方法可以使用少得多的鍵入來完成,並且可以普遍應用。

10

您可以設置CONFLICT_IGNORE行爲插入行的衝突:

public long insertString(String key, String value) { 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(key, value); 
    return db.insertWithOnConflict(DATABASE_TABLE, null, initialValues, SQLiteDatabase.CONFLICT_IGNORE); 
} 

但這取決於約束。如果將來需要更多的行爲。

3

的解決方案是不是在Android的API,但在數據庫中。如果你想確保你插入的字符串不存在於數據庫中,有兩種可能的解決方案。

  1. 創建數據庫時

    使列UNIQUE(您想插入字符串),這將阻止其進入副本到該列。當你嘗試插入並且是重複的時,它會拋出一個錯誤;你可以通過異常處理來處理它。

  2. 您可以創建第二個方法(每次插入後調用;這是昂貴的),檢查表中的重複項並將其刪除。

我會去與方法1.

這裏是一個樣本UNIQUE語法

create table tablename(col1 datatype, col2 datatype, col3 datatype, UNIQUE(col1));

好運