android developer tiny share-20170522

来源:互联网 发布:韩素音翻译大赛 知乎 编辑:程序博客网 时间:2024/05/16 11:13

今天继续讲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 为“sampleuser@google.com”、ACCOUNT_TYPE 为“com.google”、OWNER_ACCOUNT 为“sampleuser@google.com”的日历。如果您想查看用户查看过的所有日历,而不只是用户拥有的日历,请省略 OWNER_ACCOUNT。您可以利用查询返回的 Cursor 对象遍历数据库查询返回的结果集。 如需查看有关在内容提供程序中使用查询的详细介绍,请参阅内容提供程序。

// Run queryCursor 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[] {"sampleuser@gmail.com", "com.google",        "sampleuser@gmail.com"};// 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 recordswhile (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 帐户不会进行同步。


原创粉丝点击