使用過 SQLite 數(shù)據(jù)庫的童鞋對 Cursor 應(yīng)當不陌生,如果你是弄.net 開發(fā)你大可以把Cursor理解成 Ado.net 中的數(shù)據(jù)集合相當于dataReader。今天特地將它單獨拿出來談,加深自己和大家對Android 中使用 Cursor 的理解。
關(guān)于 Cursor
在你理解和使用 Android Cursor 的時候你必須先知道關(guān)于 Cursor 的幾件事情:
- Cursor 是每行的集合。
- 使用 moveToFirst() 定位第1行。
- 你必須知道每列的名稱。
- 你必須知道每列的數(shù)據(jù)類型。
- Cursor 是1個隨機的數(shù)據(jù)源。
- 所有的數(shù)據(jù)都是通過下標獲得。
關(guān)于 Cursor 的重要方法:
- close()
關(guān)閉游標,釋放資源 - copyStringToBuffer(int
columnIndex,
CharArrayBuffer buffer)
在緩沖區(qū)中檢索要求的列的文本,將將其存儲 - getColumnCount()
返回所有列的總數(shù) - getColumnIndex(String
columnName)
返回指定列的名稱,如果不存在返回⑴ - getColumnIndexOrThrow(String
columnName)
從零開始返回指定列名稱,如果不存在將拋出IllegalArgumentException 異常。 - getColumnName(int columnIndex)
從給定的索引返回列名 - getColumnNames()
返回1個字符串數(shù)組的列名 - getCount()
返回Cursor 中的行數(shù) - moveToFirst()
移動光標到第1行 - moveToLast()
移動光標到最后1行 - moveToNext()
移動光標到下1行 - moveToPosition(int position)
移動光標到1個絕對的位置 - moveToPrevious()
移動光標到上1行
下面來看看1小段代碼:
if (cur.moveToFirst() == false)
{
//為空的Cursor
return;
}
訪問 Cursor 的下標取得其中的數(shù)據(jù)
int nameColumnIndex = cur.getColumnIndex(People.NAME);
String name = cur.getString(nameColumnIndex);
現(xiàn)在讓我們看看如何循環(huán) Cursor 取出我們需要的數(shù)據(jù)
while(cur.moveToNext())
{
//光標移動成功
//把數(shù)據(jù)取出
}
當cur.moveToNext() 為假時將跳出循環(huán),即 Cursor 數(shù)據(jù)循環(huán)終了。
如果你喜歡用 for 循環(huán)而不想用While 循環(huán)可使用Google 提供的幾下方法:
- isBeforeFirst()
返回游標是不是指向之前第1行的位置 - isAfterLast()
返回游標是不是指向第最后1行的位置 - isClosed()
如果返回 true 即表示該游戲標己關(guān)閉
有了以上的方法,可以如此取出數(shù)據(jù)
for(cur.moveToFirst();!cur.isAfterLast();cur.moveToNext())
{
int nameColumn = cur.getColumnIndex(People.NAME);
int phoneColumn = cur.getColumnIndex(People.NUMBER);
String name = cur.getString(nameColumn);
String phoneNumber = cur.getString(phoneColumn);
}
Tip:在Android 查詢數(shù)據(jù)是通過Cursor 類來實現(xiàn)的。當我們使用 SQLiteDatabase.query()方法時,就會得到Cursor對象, Cursor所指向的就是每條數(shù)據(jù)。結(jié)合ADO.net 的知識可能好理解1點。
Cursor 位于 android.database.Cursor類,可見出它的設(shè)計是基于數(shù)據(jù)庫服務(wù)產(chǎn)生的。
另外,還有幾個己知的子類,分別為:
- AbstractCursor
- AbstractWindowedCursor
- CrossProcessCursor
- CursorWrapper
- MatrixCursor
- MergeCursor
- MockCursor
- SQLiteCursor
具體詳細的使用方法和解釋可以去參照API,這里就不過量講述。