Cursor(游標)是Android資料模組裡很重要的一個結構,他不僅會跟Database有關, 也跟其他需要處理多筆資料的類別有很緊密的關係,像是在Media, Video, ContentProvider, Listview都可以見到Cursor的蹤影。

Cursor的階層體系

cursor_001.png

跟Bundle相關的method
  • getExtras()
  • respond(Bundle)
Metadata相關的method
  • getColumnCount()
  • getColumnIndex(String)
  • getColumnIndexOrThrow(String)
  • getColumnName(int)
  • getColumnNames()
位置相關的method
  • isAfterLast()
  • isBeforeFirst()
  • isClosed()
  • isFirst()
  • isLast()
  • isNull(int)
  • move(int)
  • moveToFirst()
  • moveToLast()
  • moveToNext()
  • moveToPosition(int)
  • moveToPrevious()
讀取資料相關的method
  • getCount()
  • getDouble(int)
  • getFloat(int)
  • getInt(int)
  • getLong(int)
  • getPosition()
  • getShort(int)
  • getString(int)
  • getBlob(int)
資料異動通知相關的method
  • registerContentObserver(ContentObserver)
  • registerDataSetObserver(DataSetObserver)
  • setNotificationUri(ContentResolver, Uri)
  • unregisterContentObserver(ContentObserver)
  • unregisterDataSetObserver(DataSetObserver)

registerContentObserver是接收(觀察)ContentResolver.notifyChange(uri, null)的事件,當notifyChange()被呼叫時,ContentObserver會被通知。 notifyChange()是一個程式慣例,要由寫程式的人自已進行呼叫。

setNotificationUri通常用在ContentProvider.query(),裡,在下面的例子中 c.setNotificationUri(getContext().getContentResolver(), uri); 是用在cursor被建立後,如果資料內容被其它程式異動時,cursor會自已知道已經不是最新狀態而自行requery.

    // SQLiteQueryBuilder is a helper class that creates the
            // proper SQL syntax for us.
            SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();
     
            // Set the table we're querying.
            qBuilder.setTables(DATABASE_TABLE_NAME);
     
            // If the query ends in a specific record number, we're
            // being asked for a specific record, so set the
            // WHERE clause in our query.
            if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){
                qBuilder.appendWhere("_id=" + uri.getPathLeafId());
            }
     
            // Make the query.
            Cursor c = qBuilder.query(mDb,
                    projection,
                    selection,
                    selectionArgs,
                    groupBy,
                    having,
                    sortOrder);
            c.setNotificationUri(getContext().getContentResolver(), uri);
            return c