android developer tiny share-20170522

今天繼續講android的Calendar ContentProvider,講查詢日曆。

以下是android developer官網的講解:


查詢日曆


以下示例說明了如何獲取特定用戶擁有的日曆。 爲了簡便起見,在此示例中,查詢操作顯示在用戶界面線程(“主線程”)中。 實際上,此操作應該在一個異步線程而非主線程中完成。 如需查看更詳細的介紹,請參閱加載器。 如果您的目的不只是讀取數據,還要修改數據,請參閱 AsyncQueryHandler。

// Projection array. Creating indices for this array instead of doing
// dynamic lookups improves performance.
public static final String[] EVENT_PROJECTION = new String[] {
    Calendars._ID,                           // 0
    Calendars.ACCOUNT_NAME,                  // 1
    Calendars.CALENDAR_DISPLAY_NAME,         // 2
    Calendars.OWNER_ACCOUNT                  // 3
};

// The indices for the projection array above.
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1;
private static final int PROJECTION_DISPLAY_NAME_INDEX = 2;
private static final int PROJECTION_OWNER_ACCOUNT_INDEX = 3;

在示例的下一部分,您需要構建查詢。選定範圍指定查詢的條件。 在此示例中,查詢尋找的是 ACCOUNT_NAME 爲“[email protected]”、ACCOUNT_TYPE 爲“com.google”、OWNER_ACCOUNT 爲“[email protected]”的日曆。如果您想查看用戶查看過的所有日曆,而不只是用戶擁有的日曆,請省略 OWNER_ACCOUNT。您可以利用查詢返回的 Cursor 對象遍歷數據庫查詢返回的結果集。 如需查看有關在內容提供程序中使用查詢的詳細介紹,請參閱內容提供程序

// Run query
Cursor cur = null;
ContentResolver cr = getContentResolver();
Uri uri = Calendars.CONTENT_URI;
String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND ("
                        + Calendars.ACCOUNT_TYPE + " = ?) AND ("
                        + Calendars.OWNER_ACCOUNT + " = ?))";
String[] selectionArgs = new String[] {"[email protected]", "com.google",
        "[email protected]"};
// Submit the query and get a Cursor object back.
cur = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null);

以下後續部分使用遊標單步調試結果集。它使用在示例開頭設置的常量來返回每個字段的值。

// Use the cursor to step through the returned records
while (cur.moveToNext()) {
    long calID = 0;
    String displayName = null;
    String accountName = null;
    String ownerName = null;

    // Get the field values
    calID = cur.getLong(PROJECTION_ID_INDEX);
    displayName = cur.getString(PROJECTION_DISPLAY_NAME_INDEX);
    accountName = cur.getString(PROJECTION_ACCOUNT_NAME_INDEX);
    ownerName = cur.getString(PROJECTION_OWNER_ACCOUNT_INDEX);

    // Do something with the values...

   ...
}

爲何必須加入 ACCOUNT_TYPE?
如果您查詢 Calendars.ACCOUNT_NAME,還必須將 Calendars.ACCOUNT_TYPE 加入選定範圍。這是因爲,對於給定帳戶,只有在同時指定其 ACCOUNT_NAME 及其 ACCOUNT_TYPE 的情況下,才能將其視爲唯一帳戶。ACCOUNT_TYPE 字符串對應於在 AccountManager 處註冊帳戶時使用的帳戶驗證器。還有一種名爲 ACCOUNT_TYPE_LOCAL 的特殊帳戶類型,用於未關聯設備帳戶的日曆。ACCOUNT_TYPE_LOCAL 帳戶不會進行同步。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章