2016-02-13 28 views
0

我試圖使用How to represent 2 cursors as 1 sorted cursor?中提到的AOSP中的SortCursor類。但是,它似乎並沒有對我所給予的遊標進行排序。排序如何工作?AOSP存儲庫的SortCursor如何對其值進行排序

示例代碼:

String[] columnNames = {"name", "value"}; 

MatrixCursor matrixCursor1 = new MatrixCursor(columnNames); 
matrixCursor1.addRow(new String[]{"cursor 1 value A", "9"}); 
matrixCursor1.addRow(new String[]{"cursor 1 value B", "2"}); 
matrixCursor1.addRow(new String[]{"cursor 1 value C", "1"}); 

MatrixCursor matrixCursor2 = new MatrixCursor(columnNames); 
matrixCursor2.addRow(new String[]{"cursor 2 value A", "70"}); 
matrixCursor2.addRow(new String[]{"cursor 2 value B", "8"}); 
matrixCursor2.addRow(new String[]{"cursor 2 value C", "6"}); 

Cursor sortCursor = new SortCursor(new Cursor[]{matrixCursor1, matrixCursor2}, columnNames[1]); 
while (sortCursor.moveToNext()) { 
    String name = sortCursor.getString(sortCursor.getColumnIndexOrThrow(columnNames[0])); 
    String value = sortCursor.getString(sortCursor.getColumnIndexOrThrow(columnNames[1]));; 
    Log.v("SortCursor", "Name: " + name + ", Value: " + value); 
} 
sortCursor.close(); 

輸出,當我運行這段代碼:

V/SortCursor: Name: cursor 2 value A, Value: 70 
V/SortCursor: Name: cursor 2 value B, Value: 8 
V/SortCursor: Name: cursor 2 value C, Value: 6 
V/SortCursor: Name: cursor 1 value A, Value: 9 
V/SortCursor: Name: cursor 1 value B, Value: 2 
V/SortCursor: Name: cursor 1 value C, Value: 1 

正如你所看到的值是完全無序。我期望1,2,6,8,9,70。

回答

0

關於SortCursor有兩件重要的事情要知道。

1.它從遊標中讀取值作爲字符串而不是數字,所以字符串「70」小於字符串「8」。

2.它只是比較每個遊標的下一個值,當它正在尋找最小的值。所以每個單獨的遊標必須在它被賦予SortCursor之前進行排序。

因此,在給定的例子中,「70」小於「9」,因此首先,然後「8」小於「9」,因此下一個,「6」小於「9」下一個。然後只剩下第一個遊標中的值。

正如你看到的你使用的遊標實際上是排序的,它只是沒有按你期望的排序方式排序。

如果您在創建SortCursor並使用字符串而不是數字之前對各個遊標進行排序,您將獲得預期結果。

MatrixCursor matrixCursor1 = new MatrixCursor(columnNames); 
matrixCursor1.addRow(new String[]{"cursor 1 value C", "01"}); 
matrixCursor1.addRow(new String[]{"cursor 1 value B", "02"}); 
matrixCursor1.addRow(new String[]{"cursor 1 value A", "09"}); 

MatrixCursor matrixCursor2 = new MatrixCursor(columnNames); 
matrixCursor2.addRow(new String[]{"cursor 2 value C", "06"}); 
matrixCursor2.addRow(new String[]{"cursor 2 value B", "08"}); 
matrixCursor2.addRow(new String[]{"cursor 2 value A", "70"}); 

會給你

V/SortCursor: Name: cursor 1 value C, Value: 01 
V/SortCursor: Name: cursor 1 value B, Value: 02 
V/SortCursor: Name: cursor 2 value C, Value: 06 
V/SortCursor: Name: cursor 2 value B, Value: 08 
V/SortCursor: Name: cursor 1 value A, Value: 09 
V/SortCursor: Name: cursor 2 value A, Value: 70 
相關問題