2017-02-01 4 views
-2

Ich habe eine Datenbank und in einer seiner Tabellen speichere ich Pfade zu Dokumenten. Von Zeit zu Zeit muss ich Zeilen mit bestimmten Erweiterungen löschen. Ich habe ein Array mit Erweiterungen und ich bin Löschen von Zeilen aus meiner db auf diese WeiseDie beste Methode zum Löschen von String-Zeilen mit mehreren Bedingungen in SQLite in Android

public void deletePathsExceptThis(String [] extensions){ 
    SQLiteDatabase db = getWritableDatabase(); 
    String query = ""; 
    for (int i=0; i< extensions.length-1; i++){ 
     query = query.concat(" LOWER(" + ALL_DOCUMENTS_PATH + ") NOT LIKE ('"); 
     query = query.concat(extensions[i]); 
     query = query.concat("') OR "); 
    } 
    query = query.concat(" LOWER(" + ALL_DOCUMENTS_PATH + ") NOT LIKE ('"); 
    query = query.concat(extensions[extensions.length-1]) ; 
    query = query.concat("')"); 
    db.delete(TABLE_ALL_DOCUMENTS, query, null); 
} 

Aber ich frage mich, kann es einige weitere schnelle, produktive oder elegante Möglichkeiten, um die Arbeit zu tun? Dank

+3

Nun, für Vorspeisen, ich glaube, ein 'StringBuilder' wird bevorzugt über' String.concat' –

+0

Es gibt sogar eine [SQLiteQueryBuilder ] (https://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html) - Nevermind - nur für SELECT ... – Fildor

+0

so StringBuilder wird schneller sein? Weil ich einige Vergleiche sah, bei denen concat weniger Zeit in Anspruch nahm als StringBuilder zu verwenden – Fedor

Antwort

1

Sie könnten versuchen, in der Nähe des gleichen GLOB Wort

https://www.sqlite.org/lang_expr.html#glob

aber diese yeilds nahe dem gleichen Ergebnis zu verwenden.

Oder schreiben Sie Ihre eigene Regexp-Methode.

https://www.sqlite.org/lang_expr.html#regexp

aber trotzdem muss ich Ihren Code optimieren:

public void deletePathsExceptThis(String [] extensions){ 
    if (extensions == null || extensions.length == 0) 
      return; 
    SQLiteDatabase db = getWritableDatabase(); 
    StringBuilder query = new StringBuilder(); 
    for (int i = 0; i < extensions.length; i++){ 
     query.concat(" LOWER(").append(ALL_DOCUMENTS_PATH).append(") NOT LIKE ('"); 
     query.append(extensions[i].replaceAll("'","''")); 
     String ext = i == extensions.length - 1 ? "" : " OR "; 
     query.append("')").append(ext); 
    } 
    db.delete(TABLE_ALL_DOCUMENTS, query.toString(), null); 
} 
+0

Danke für die Antwort) – Fedor

+0

@Fedor, genehmigen Sie, wenn es hilfreich war. 'String' sind viel langsamer als' StringBuilders'. sogar 'concat' Methode gegen' append'. 'Concat' erstellt und kopiert die riesige String-Klasse sehr oft. – Vyacheslav

+0

Danke, ich habe mich geirrt, dass Concat schneller ist. Aber im Allgemeinen eignet sich meine Lösung zum Erstellen einer Löschanforderung zum Löschen von String-Zeilen mit mehr als einer Bedingung? – Fedor

Verwandte Themen