2013-03-29 18 views
14

Wiem, że istnieje polecenie SQL, które wygląda następująco: IF NOT EXISTS, ale ponieważ klasa Androida SQLiteDatabase ma kilka dobrych metod, zastanawiałem się, czy możliwe jest wstaw wartość, jeśli nie istnieje za pomocą metody.SQLiteDatabase: Wstaw tylko, jeśli wartość nie istnieje (nie przez surowe polecenie SQL)

Obecnie używam tego, aby wstawić String:

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

(. db jest instancją SQLiteDatabase)

Próbowałem metody insertOrThrow() zamiast insert(), ale wydaje się to robi tak samo jak insert(). Oznacza to, że jeśli wartość jest już w wierszu, jest wstawiana ponownie, więc wiersz ma teraz dwie wartości o tej samej wartości.

+1

Dlaczego nie uczynić twój klucz jest wyjątkowa? –

+0

Możesz użyć biblioteki ORM. Użyłem ORMDroid i można wykonać wiele zapytań SQL za pomocą metod. http://ormlite.com/sqlite_java_android_orm.shtml – dannyroa

Odpowiedz

14

SQLiteDatabase: Włóż tylko jeśli wartość nie istnieje (nie za pośrednictwem polecenia surowego SQL)

Ponieważ nie chcesz używać surowych zapytań można osiągnąć to, że przed włożeniem, wystarczy utworzyć część funkcji, która sprawdzi, czy wartość jest już w bazie danych. Może zwrócić wartość boolean (lub int), a jeśli zwróci false, wykonasz kwerendę wstawiania.

mały przykład:

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 
} 

jeżeli wartość jest już w rzędzie, to dodaje się ponownie tak wiersz teraz ma dwie wartości, o takiej samej wartości.

Można to rozwiązać, stosując odpowiednie ograniczenia, które nie pozwolą na wstawianie duplikatów. Sprawdź to:

+1

Dzięki mężczyzna, I rozwiązać go za pomocą ograniczeń :) – eightx2

+0

@ eightx2 zapraszamy :) – Sajmon

+0

Jak zalecane jest stosowanie ograniczeń zamiast po swój kod pisał o czeku przed włożeniem ? Testowałem więzy i zauważyłem, że ślad stosu, który jest drukowany na konsoli, nie może wstawić z powodu ograniczenia, czy to wpłynie na cokolwiek? Aplikacja nie ulega awarii i nie zauważyła spowolnienia działania, po prostu się zastanawiała. – OmarBizreh

3

Istnieją dwa podstawowe sposoby, można to zrobić:

  1. zapytań do bazy danych. Ręcznie sprawdź, czy dane już istnieją, a następnie dodaj je, jeśli nie istnieje.
  2. Użyj CONSTRAINTs. Zdefiniuj swój schemat SQL, aby uwzględniał tylko unikalne dane dla tej kolumny.

Pierwsze podejście jest łatwiejsze, jeśli chcesz wykonać różne czynności w różnych okolicznościach (lub jeśli nie masz jeszcze biegłej znajomości języka SQL). Drugie podejście można wykonać za pomocą znacznie mniejszego pisania i można je zastosować uniwersalnie.

10

Można ustawić CONFLICT_IGNORE zachowanie konfliktu wstawiania rzędu:

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); 
} 

Ale to zależy od ograniczeń. Jeśli będziesz tego potrzebować, będzie więcej zachowań.

3

Rozwiązaniem nie jest w Android Api ale w bazie danych. Jeśli chcesz się upewnić, że wstawiany ciąg nie jest już obecny w bazie danych, istnieją dwa możliwe rozwiązania.

  1. podczas tworzenia bazy danych sprawiają, że kolumna (ciąg, który chcesz wstawić) jako UNIQUE będzie to zapobiec przedostawaniu duplikaty w tej kolumnie. a kiedy spróbujesz wstawić i jest duplikatem, spowoduje to błąd; możesz sobie z tym poradzić poprzez obsługę wyjątków.

  2. Można utworzyć drugą metodę (wywoływaną po każdym wstawieniu, która jest kosztowna), która sprawdza duplikaty w tabeli i usuwa je.

pójdę z podejściem 1.

oto próbka UNIQUE składnia

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

powodzenia

Powiązane problemy