2013-12-19 10 views
5

Ich versuche eine einfache Favoriten-Anwendung zu erstellen, wo Sie Ihre Favoriten-Seiten behalten können (zum Beispiel aus dem Internet).Android SQL - Überprüfen Sie, ob die ganze Zeile bereits in der Datenbank vorhanden ist

Lassen Sie uns sagen, dass ich die folgenden Daten in meiner Datenbank

Title | URL  | TAG  | 
------------------------------- 
Hey  Ho.com Site 
Jo  Jo.com Image 
Jo  Mo.com Image 

Jetzt will ich sicherstellen, dass der Benutzer nicht hinzufügen, die gleiche Seite zweimal, also werde ich prüfen, ob der Wert bereits vorhanden sind. Aber ich muss, dass der Benutzer keine Website zu der Tabelle hinzufügt, die bereits hinzugefügt wurde.

Also lassen Sie uns sagen, ich würde versuchen, in den:

Title | URL  | TAG  | 
------------------------------- 
Jo  Mo.com Image 

Dies würde true zurück (für „prüfen, ob Zeile vorhanden ist“, da eine identische Zeile bereits vorhanden ist).

Aber wenn ich hinzufügen würde versuchen:

Title | URL  | TAG  | 
------------------------------- 
Jo  Go.com Image 

Es wäre falsch zurückgeben (wenn der Titel bereits vorhanden ist), weil es keine identische Reihe ist.

Dies ist der Code, wo ich mit meinen Daten in die Datenbank hinzufügen:

public long createNote(String title, String url, String rn) { 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_TITLE, title); 
    initialValues.put(KEY_URL, url); 
    initialValues.put(KEY_RN, rn); 

    return mDb.insert(DATABASE_TABLE, null, initialValues); 

Wie kann ich überprüfen, ob eine Zeile existiert bereits in einer Datenbank?

+1

Verwenden 'INTEGER PRIMARY KEY AUTOINCREMENT' ID. Verwenden Sie immer die ID "INTEGER PRIMARY KEY AUTOINCREMENT". Um doppelte Zeilen zu vermeiden, brauchen Sie nur eine 'UNIQUE'-Einschränkung. Siehe diese verwandte Antwort http://stackoverflow.com/a/2701903/792932 – foibs

Antwort

7

können Sie prüfen, Cursor:

public boolean checkEvent(String title, String URL, String tag) 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLES, 
      new String[] { KEY_TITLE,KEY_URL,KEY_TAG }, 
      KEY_TITLE + " = ? and "+ KEY_URL + " = ? and " + KEY_TAG + " = ?" , 
      new String[] {title,url,tag}, 
      null, null, null, null); 

    if(cursor.moveToFirst()) 

    return true; //row exists 
    else 
    return false; 

} 

bearbeiten: Code kopieren jetzt & bereit einfügen

1

Sie können abfragen, ob der eindeutige Bezeichner in der Datenbank vorhanden ist, in Ihrem Fall der Titel möglicherweise die eindeutige Kennung der Zeile.

public boolean isEntry(int title){ 
    String queryString = "SELECT * FROM "+TABLE_NAME+" WHERE "+KEY_PROJECT_ID+" = "+"'"+project_id+"'"; 
    Cursor c = db.rawQuery(queryString, null); 
    if(c.getCount() > 0){ 
     Log.i("CHECK", "true"); 
     return true; 
    } 
    else{ 
     return false; 
    } 
} 

Hier true würde bedeuten, dass es eine Reihe so ist, bedeuten false würde, dass es keinen solchen Eintrag.

Jetzt wollen wir einen Eintrag in die Datenbank einfügen. Auch wenn die Methode einen true Wert zurückgibt, können Sie die anderen beiden Werte wie in Ihrem Beispiel vergleichen. Danach könnten Sie eine Funktion aufrufen, eine einzelne Zeile aus der Datenbank zurück, wie

public String getCursor(int project_id){ 
    String queryString = "SELECT * FROM "+TABLE_NAME+" WHERE "+KEY_PROJECT_ID+" = "+"'"+project_id+"'"; 
    Cursor cursor = db.rawQuery(queryString, null); 
    return cursor; 
} 

Sobald Sie die Funktion haben, können Sie die TAG und URL daraus auswählen und sehen, ob es die in Ihrer Datenbank übereinstimmt.

So:

Cursor cursor = db.rawQuery(queryString, null); 
String tag = ""; 
String url = ""; 

cursor.moveToFirst(); 
for (int i = 0; i < cursor.getCount(); i++) { 
    like_state = cursor.getString(cursor.getColumnIndex(KEY_TAG)); 
    url = cursor.getString(cursor.getColumnIndex(KEY_URL)); 
    cursor.moveToNext(); 
} 
cursor.close(); 

if(!ins_tag.equalsIgnoreCase(tag) || !ins_url.equalsIgnoreCase(url)) { 
    //insert function here 
} 

Und wie in den Kommentaren erwähnt, sollten Sie die eine AUTOINCREAMENT ganze Zahl als Primärschlüssel verwenden.

+0

Vielen Dank für Ihre Antwort, aber ich bin wirklich auf der Suche nach einer Möglichkeit, identische Zeilen zu finden – Mdlc

+0

@Mdlc bitte überprüfen Sie bearbeiten. –

+0

Vielen Dank, ich werde versuchen, Sie wissen zu lassen – Mdlc

5

Es gibt eine sehr anmutige (imho) Möglichkeit, dies auf der Datenbankebene zu tun. Fügen Sie diese auf Ihrem Tisch SQL erstellen, wenn Sie Ihre Datenbank zu erstellen:

UNIQUE(TITLE, URL) ON CONFLICT REPLACE 

Dann können Sie alle fügen Sie, ohne überprüfen wollen, wird es entweder hinzugefügt oder aktualisiert werden, wenn die Zeile bereits vorhanden ist.

+0

Erstellen einer eindeutigen Kennung durch die Kombination verschiedener Daten ist sicherlich eine Idee! – Mdlc

+0

Dies ist eine weitaus bessere und überlegene Lösung als die, die akzeptiert wurde. Definitiv verdient eine Abstimmung. Danke :) – Varundroid

Verwandte Themen