2010-03-04 13 views
23

szukam najszybszy i prawidłowy sposób, aby sprawdzić, czy rekord istnieje w bazie danych:Android istnieje() w bazie danych?

public boolean Exists(String _id) { 
    Cursor c=db.query(TABLENAME(), new String[] {"1"}, "_ID="+_id, null, null, null, null); 
    if (!c.equals(null)) 
     return c.moveToFirst(); 
    return false; 
} 

Czy widzisz żadnego problemu z tym?

+0

Sprawdź moją odpowiedź tutaj: http://stackoverflow.com/questions/27597922/android-sqlite-check-if-row-exists-in-table/43849296#43849296 –

Odpowiedz

42

Uważają, że mDb jest klasa

public boolean Exists(String _id) { 
    Cursor cursor = mDb.rawQuery("select 1 from yourTable where _id=%s", 
     new String[] { _id }); 
    boolean exists = (cursor.getCount() > 0); 
    cursor.close(); 
    return exists; 
} 
  • SqlLiteDatabase ja utrzymać parametr _id jako String ale myślę, że powinno być Long.
  • select 1 jest szybsza niż select columnName, ponieważ proces nie musi pobierać wszystkich wartości z tabeli w klauzuli select.
  • Możesz umieścić ciąg select 1 from... w statycznej stałej końcowej, aby być jeszcze szybszym.
+0

Jeśli zmienisz swoje pytanie podczas odpowiadania. .. – tbruyelle

+4

powinieneś także zamknąć kursor przed zwróceniem wartości. nie powoduje awarii, ale daje ostrzeżenia. –

+0

Tak, masz rację, zaktualizowałem swoją odpowiedź. – tbruyelle

1

Spróbuj tego:

W swojej DatabaseHelper, umieścić tę metodę ...

public String Exist(String user) {   
    String username=""; 
    SQLiteDatabase db = this.getReadableDatabase();    

    try { 
     Cursor c = db.query(TABLE_USER, null, KEY_USER + "=?", new String[]{String.valueOf(user)},null, null, null);            

     if (c == null) {       
      return username;         
     } 
     else {  
      c.moveToFirst();    
      username = c.getString(c.getColumnIndex(KEY_USER)); 
     }       
    } 

    catch(Exception e){ 
     e.printStackTrace(); 
    } 

    return username; 
} 

następnie w onClickListener, starają się wywołać metodę, aby utworzyć w swoim DatabaseHelper. Wypróbuj ten kod:

String myUser = txtUser.getText().toString(); 
String storedUser = db.Exist(myUser); 


//If Username exist 
if (myUser.equals(storedUser)){ 
    Toast.makeText(getApplicationContext(), "Username already exist!", Toast.LENGTH_SHORT).show(); 
5

To pytanie i wybrana odpowiedź były dla mnie pomocne w zrozumieniu, jak łatwo i szybko sprawdzić, czy rekord został zakończony. Jednak widziałem wiele miejsc, które zalecają przeciw użyciu rawQuery ze względu na możliwość wstrzyknięcia SQL. (Na przykład, rawQuery Vs. database.query)

Więc tutaj jest to, co ja zdecydowaliśmy się na:

public boolean Exists(String searchItem) { 

    String[] columns = { COLUMN_NAME }; 
    String selection = COLUMN_NAME + " =?"; 
    String[] selectionArgs = { searchItem }; 
    String limit = "1"; 

    Cursor cursor = db.query(TABLE_NAME, columns, selection, selectionArgs, null, null, null, limit); 
    boolean exists = (cursor.getCount() > 0); 
    cursor.close(); 
    return exists; 
} 

Nie wiem, czy to jest tak szybki jak wybranej odpowiedzi lub nie, ale po badaniu to wydaje się zgodne do zalecanych konwencji Androida.

Aktualizacja

teraz polecić @ odpowiedź Yuku, ale nie usunie kopalnię jeszcze bo nadal chce prowadzić ludzi od korzystania surowe zapytań.

4

Ponieważ szukasz odpowiedzi z "wiarygodnych i/lub oficjalnych źródeł", tutaj w DatabaseUtils mamy metodę o nazwie queryNumEntries.

Więc metoda może być tak:

public boolean Exists(String _id) { 
    return DatabaseUtils.queryNumEntries(db, TABLENAME(), "_ID=?", new String[] {"1"}) > 0; 
} 

Albo na szybsze jednym:

public boolean Exists(String _id) { 
    return DatabaseUtils.longForQuery(db, "select count(*) from " + TABLENAME() + " where _ID=? limit 1", new String[] {"1"}) > 0; 
} 
+0

Był to rodzaj odpowiedzi, której szukałem, kiedy zdobyłem nagrodę.Nie wiedziałem wcześniej o tych DatabaseUtils. Jeśli nie miałbyś nic przeciwko możesz krótko wyjaśnić, dlaczego longForQuery jest szybszy? Dokumentacja jest trochę rzadki na tym .. – Suragch

+0

Myślę, że jest to szybciej ze względu na klauzulę LIMIT 1, uniemożliwiając zliczanie liczby wierszy, jeśli masz wiele wierszy, które spełniają kryteria wyboru. Ponieważ jednak twoje kryteria to _ID, które można przyjąć za unikalne dla konkretnej tabeli, obie powinny mieć tę samą prędkość. – yuku

0

Działa to dobrze:

Cursor cursor = null; 
    String sql ="SELECT * FROM "+TableName+" WHERE ID="+idValue; 
    cursor= db.rawQuery(sql,null); 
    Log.d("ISEXISTS","Cursor Count : " + cursor.getCount()); 

    boolean exists = (cursor.getCount() > 0); 
    cursor.close(); 
Powiązane problemy