如何按即将到来的生日顺序获取联系人?

奔腾10:

我有用于阅读联系方式和阅读生日的代码。但是,如何按即将到来的生日顺序获取联系人列表?

对于由标识的单个联系人id,我将获得以下详细信息和生日:

Cursor c = null;
  try {
   Uri uri = ContentUris.withAppendedId(
     ContactsContract.Contacts.CONTENT_URI, id);
   c = ctx.getContentResolver().query(uri, null, null, null, null);
   if (c != null) {
    if (c.moveToFirst()) {
     DatabaseUtils.cursorRowToContentValues(c, data);
    }

   }
   c.close();

   // read birthday
   c = ctx.getContentResolver()
     .query(
       Data.CONTENT_URI,
       new String[] { Event.DATA },
       Data.CONTACT_ID + "=" + id + " AND "
         + Data.MIMETYPE + "= '"
         + Event.CONTENT_ITEM_TYPE + "' AND "
         + Event.TYPE + "=" + Event.TYPE_BIRTHDAY,
       null, Data.DISPLAY_NAME);
   if (c != null) {
    try {
     if (c.moveToFirst()) {
      this.setBirthday(c.getString(0));
     }
    } finally {
     c.close();
    }
   }

   return super.load(id);
  } catch (Exception e) {
   Log.v(TAG(), e.getMessage(), e);
   e.printStackTrace();
   return false;
  } finally {
   if (c != null)
    c.close();
  }

读取所有联系人的代码是:

public Cursor getList() {
        // Get the base URI for the People table in the Contacts content
        // provider.
        Uri contacts = ContactsContract.Contacts.CONTENT_URI;
        // Make the query.
        ContentResolver cr = ctx.getContentResolver();
        // Form an array specifying which columns to return.
        String[] projection = new String[] { ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME };

        Cursor managedCursor = cr.query(contacts, projection, null, null,
                ContactsContract.Contacts.DISPLAY_NAME
                        + " COLLATE LOCALIZED ASC");
        return managedCursor;
    }
痣:

我以相反的方式进行了此操作-直接选择存储生日的数据表。

private static final int UPCOMING_COUNT = 10;


public static List<BContact> upcomingBirthday(Context ctx) {
    String today = new SimpleDateFormat("MM-dd").format(new Date());        
    List<BContact> firstPart = upcomingBirthday(ctx, today, "12-31", UPCOMING_COUNT);
    if (firstPart.size() < UPCOMING_COUNT) {
        firstPart.addAll(upcomingBirthday(ctx, "01-01", today, UPCOMING_COUNT - firstPart.size()));
    }
    return firstPart;
}


public static List<BContact> upcomingBirthday(Context ctx, String fromDate, String toDate, int rows) {

  Uri dataUri = ContactsContract.Data.CONTENT_URI;

  String[] projection = new String[] { ContactsContract.Contacts.DISPLAY_NAME,                         
            ContactsContract.CommonDataKinds.Event.CONTACT_ID,
            ContactsContract.CommonDataKinds.Event.START_DATE
            };


  Cursor c = ctx.getContentResolver().query(
       dataUri,
       projection, 
       ContactsContract.Data.MIMETYPE + "= ? AND " + 
       ContactsContract.CommonDataKinds.Event.TYPE + "=" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY + 
       " AND substr(" + ContactsContract.CommonDataKinds.Event.START_DATE + ",6) >= ?" + 
       " AND substr(" + ContactsContract.CommonDataKinds.Event.START_DATE + ",6) <= ?" ,
       new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, fromDate, toDate}, 
       "substr("+ ContactsContract.CommonDataKinds.Event.START_DATE +",6)");
  List<BContact> result = new ArrayList<BContact>();
  int i=0;
  while (c.moveToNext() && i<rows) {
      result.add(new BContact(c.getString(0), c.getString(1), c.getString(2)));
      i++;
  }
  c.close();
  return result;

}

SELECT被两次调用-从今天到12/31的一次呼叫,从01/01到今天的第二次呼叫。我限制返回的行数为10,但这不是必需的。

编辑:我发现这不适用于所有Android手机,因为生日日期以许多不同的格式存储。因此,您必须加载所有生日(无序),对其进行解析并在内存中进行排序。#失败

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android 11 获取联系人的生日

如何获取即将到来的文件大小,以KB为单位

如何获取当前日期和即将到来的日期?

SQLAlchemy按即将到来的生日/周年纪念日筛选

甲骨文今年即将到来的生日

如何从联系人获取联系人图像URL?

获取今天有生日的联系人

ArrayIndexOutOfBoundsException即将到来

如何用Java获取过去的星期日和即将到来的星期日?

如何获取即将到来的特定时间的java.time.LocalDateTime对象?

如何从 CONTENT URI 获取联系人

如何在通讯录中按字母顺序排列联系人?

未获取未定义的 JavaScript 值即将到来

获取即将到来的夏令时日期

全文链接即将到来

如何检查即将到来的空值(jQuery)?

在 Microsoft Graph 中按 ID 批量获取联系人

获取Android应用程序中每个联系人的生日

首先按照最近或即将到来的日期的顺序获取排序列表,然后根据今天的日期获取其余的列表

如何从 Android 联系人中的联系人 ID 中获取只读帐户名称

如何在Swift中获取联系人全名

Android-如何获取已保存的联系人ID

如何以编程方式从Android获取whatsapp联系人?

如何获取邮件联系人所属的所有组?

如何获取联系人并使用flutter打印它们?

如何获取联系人的昵称Windows Phone 8.1

如何使用CNContactStoreDidChangeNotification获取更新/添加/删除的联系人

如何在iOS中获取联系人?

如何从Azure广告图API获取联系人