2017-02-01 33 views
-2

我有一個數據庫,並在其中的一個表中存儲了文檔的路徑。我需要刪除具有特定擴展名的行。我有一個擴展陣列,我從我的分貝這樣在Android中使用SQLite中的多個條件刪除字符串行的最佳方法

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

刪除行,但我想,可能是有一些更快速,高效和優雅的方式來做到這一點的工作嗎?由於

+3

嗯,首先,我想'StringBuilder'優於'String.concat' –

+0

甚至有一個[SQLiteQueryBuilder ](https://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html) - Nevermind - 只適用於SELECT ... – Fildor

+0

所以StringBuilder會更快?因爲我看到一些比較concat花費的時間少於使用StringBuilder – Fedor

回答

1

你可以嘗試接近相同GLOB

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

使用,但接近相同的結果。這yeilds。

或者編寫自己的正則表達式方法。

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

但無論如何我必須優化代碼:

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

感謝您的答案) – Fedor

+0

@Fedor,批准它是否有幫助。 'String'比'StringBuilders'慢得多。即使'concat'方法vs'append'。 'Concat'創建並複製大量的String類很多次。 – Vyacheslav

+0

謝謝,我錯誤地認爲concat更快。但一般來說,創建刪除請求的解決方案適用於刪除具有多個條件的字符串行? – Fedor

相關問題