Java 如何按即将到来的生日顺序获得联系人?
我有阅读联系方式和生日的代码。但是,我如何按照联系人即将到来的生日顺序获得联系人列表呢 对于由Java 如何按即将到来的生日顺序获得联系人?,java,android,sqlite,android-contentresolver,Java,Android,Sqlite,Android Contentresolver,我有阅读联系方式和生日的代码。但是,我如何按照联系人即将到来的生日顺序获得联系人列表呢 对于由id标识的单个联系人,我会得到如下详细信息和生日: Cursor c = null; try { Uri uri = ContentUris.withAppendedId( ContactsContract.Contacts.CONTENT_URI, id); c = ctx.getContentResolver().query(uri, null, null, null, n
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;
}
在调用getList()中的query()时修改sort参数。当前设置为显示_名称。请尝试键入_birth.也许,您希望使用如下答案中所示的游标Joiner:
我有一个类似的问题,我还没有解决,所以我想知道你是否能解决这个问题。我想我应该按生日对列表进行排序,然后将该列表复制到第二个列表中,使用今天的日期作为“零日期”。这样做似乎比尝试敲出适当的查询更干净,虽然可能会慢一点。我最终得到了这个解决方案
- 在我的SQLite数据库中创建了一个数据持有者表,用于保存联系人id、姓名和生日
- 阅读设置了生日的联系人
- 将具有生日的联系人插入表中
- 返回一个游标,该游标在SQL中计算当前生日时执行rawQuery
因此,在最后一个例子中,我从数据库中得到了一个带有联系人id、显示名称和生日的光标,其顺序与我想要的顺序相同,我是以另一种方式完成的,即直接选择存储生日的数据表
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;
private static final int\u COUNT=10;
公共静态列表升级(上下文ctx){
String today=新的SimpleDataFormat(“MM dd”).format(新日期());
列出第一部分=即将到来的生日(ctx,今天,“12-31”,即将到来的计数);
if(firstPart.size()=?”+
和substr(“+ContactsContract.CommonDataTypes.Event.START\u DATE+”,6)这并不是那么简单。两个不同的内容提供商可以访问这两个。因此,我不希望按生日进行简单的订购,我希望以即将到来的方式订购,因此,有人在3月23日过生日将是第一个,明年2月将是最后一个。CursorJoiner要求在Joiner上对两个游标进行排序。我想知道此查询是否返回是生日还是周年纪念日?它会返回所有即将到来的日期吗?例如:如果我在12月25日查询,它会返回25日之后和1月1日之后有周年纪念的人吗?1)它以yyyy-MM-dd格式返回生日。要获取周年日期,必须对其进行子串。2)我通过调用查询两次来解决它-检查编辑的代码。