كيف تحصل على جهات اتصال من أجل أعياد الميلاد القادمة؟

StackOverflow https://stackoverflow.com/questions/2482631

سؤال

لدي رمز لقراءة تفاصيل الاتصال وقراءة أعياد الميلاد. ولكن كيف يمكنني الحصول على قائمة جهات الاتصال بترتيب عيد ميلادهم القادم؟

لجهة اتصال واحدة تم تحديدها بواسطة 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 حيث يتم تخزين تواريخ عيد الميلاد في العديد من التنسيقات المختلفة. لذلك عليك تحميل جميع أعياد الميلاد (غير مرتبة) ، وتحليلها وفرزها في الذاكرة. #يفشل

نصائح أخرى

أعتقد أنني سأحصل على القائمة حسب عيد ميلاد ، ثم نسخ تلك القائمة إلى قائمة ثانية ، باستخدام تاريخ اليوم باعتباره "تاريخ الصفر". يبدو أنه سيكون من الأنظف أن تفعل ذلك بهذه الطريقة بدلاً من محاولة استفسار استعلام مناسب ، على الرغم من أنه قد يكون لمسة أبطأ.

انتهى بي الأمر بهذا الحل

  • تم إنشاء جدول حامل بيانات في قاعدة بيانات SQLite الخاصة بي لعقد معرف الاتصال والاسم وتاريخ عيد الميلاد
  • اقرأ جهات الاتصال التي لديها مجموعة عيد ميلاد
  • أدخل جهات الاتصال مع عيد ميلاد في الطاولة
  • ارجع المؤشر ، وهو ما يفعله Rawquery عندما يتم حساب عيد الميلاد الحالي في SQL

لذا في النهائي ، انتهى بي الأمر بوجود مؤشر مع معرف جهات الاتصال واسم العرض وعيد الميلاد من قاعدة البيانات بالترتيب الذي أردت

ربما ، تريد استخدام المؤشر كما في الإجابة التالية:http://www.mail-archive.com/android-developers@googlegroups.com/msg44317.html

لدي مشكلة مماثلة لم أحلها بعد ، لذلك أحب أن أعرف ما إذا كان يمكنك الحصول على هذا العمل.

قم بتعديل المعلمة الفرز في الاحتجاج الخاص بك من Query () في getList (). يتم تعيينه حاليًا على Display_name. جرب type_birthday.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top