我有用于阅读联系方式和阅读生日的代码。但是,如何按即将到来的生日顺序获取联系人列表?
对于由标识的单个联系人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手机,因为生日日期以许多不同的格式存储。因此,您必须加载所有生日(无序),对其进行解析并在内存中进行排序。#失败
问题内容: 我正在尝试编写查询以选择其生日在未来7天内的数据库用户。 我已经做了很多研究,但无法提出可行的解决方案。 生日字段存储为varchar,例如‘04 / 16/93’,有什么办法可以使用? 这是我到目前为止的内容: 我应该说得更清楚一些,我想找到生日而不是生日。所以我只是在寻找几天和几个月而不是几年。 问题答案: 要获得接下来7天内的所有生日,请将出生日期和今天之间的年份差值与出生日期相
问题内容: 我问如何用Java检测日期是在本周还是下周?但是答案令人困惑,所以现在我想,如果我可以找到过去的星期日和下一个星期日,这周之间的任何一天,以及下一个星期天和下一个星期天之后的任何一天,对吗? 所以我的新问题是:如何用Java获取过去的星期日和即将到来的星期日? 问题答案: 这个怎么样 : 结果 : 前两个之间的任何一天是本周,后两个之间的任何一天都是下周。
问题内容: 在我的android应用程序中,我用以下代码读出了所有联系人: 这就是我试图为每个联系人读出生日事件的方式。但是显然它还不起作用。那么,如何正确读出联系人的生日? 问题答案: 温馨提示: 某些OEM会提供自己的联系人提供商(不是标准的Android提供商),并且 可能 未遵循标准的Android惯例。例如,com.android.providers.contacts.HtcContac
问题内容: 我有下表的人和他们的生日: 而且我不知道如何根据生日离今天有多近来对名字进行排序。因此,对于NOW()= 2011-09-08,排序结果应为: 我正在寻找一个快速的技巧,并不真正在意性能(宠物项目-表将容纳少于1000条记录),但是当然每个建议都会受到赞赏。 问题答案: 这是一种方法: 计算 当前年份 - 出生年份 将得出的年数加上 出生日期 您现在有今年的生日,如果这个日期过去了,再
问题内容: 是否可以在一个查询中完成? 据我所知sim联系人的内容uri是 问题答案: 这很容易!:)
问题内容: 我正在使用Firebase,直到最近我都没有按字母顺序获取数据的问题。我从来没有使用过查询,我总是只使用数据快照并逐一对其进行排序。最近,在 snapVal中 ,数据并不总是按字母顺序 排列 。如何做到这一点,以便获得按字母顺序排序的数据的snapVal,就像数据库快照中的快照一样? 真实示例:有4条消息,id1-id4(按此顺序)。它们包含消息“ 1”-“ 4”。快照看起来正确。但是