2012-10-18 13 views
2

我正在實現一個ContentProvider,當我實現查詢方法時,我遇到了一些困難。ContentProvider實現,如何將「選擇」和「SelectionArgs」轉換爲鍵值對?

public final Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 

如何獲取參數的鍵值對?

假設用戶傳遞類似「a =?和b =?」的東西和2,「hello」as selectionArgs,我想獲得一個HashMap {a:2,b:「hello」}。

+0

你要面對的問題是,你的地圖是無法representant運營商(或VS和) – njzk2

+0

那麼什麼是你的建議嗎? – Bear

+0

我不知道你在做什麼 – njzk2

回答

5

下面是一個程序,演示您正在尋找的解決方案。仔細查看getHashmap()方法,該方法將選擇字符串和選擇參數作爲參數,並返回您正在查找的哈希表。我用你的數據集作爲例子。取決於你在尋找什麼,它應該離你的解決方案更近一步。唯一需要注意的是,如果您要使用不同的邏輯比較以及'=',則需要修改正則表達式。讓我知道,如果它很好地爲您

public static void main(String[] args) { 
     String sel = "a=? and b=?"; 
    String[] ags = new String[] { "2", "hello" }; 
     HashMap<String, String> result = getHashmap(sel, ags); 

    Iterator it = result.entrySet().iterator(); 
    while (it.hasNext()) { 
     Map.Entry pairs = (Map.Entry) it.next(); 
     System.out.println(pairs.getKey() + " = " + pairs.getValue()); 
     it.remove(); 
    } 

} 

public static HashMap<String, String> getHashmap(String selection, 
     String[] selectionArgs) { 
     HashMap<String, String> result = new HashMap<String, String>(); 

    Pattern pattern = Pattern.compile("[a-z]*(\\s)*=\\?", 
    Pattern.CASE_INSENSITIVE); 

    Matcher matcher = pattern.matcher(selection); 

    int pos = 0; 
    while (matcher.find()) { 
     String[] selParts = matcher.group(0).split("="); 
     result.put(selParts[0], selectionArgs[pos]); 
    pos++; 
    } 

    return result; 
} 
+0

你失去了'和'信息 – njzk2

+0

不錯。請注意,該模式應該允許使用下劃線,這是列名中的一個常見字符。 –

相關問題