7

連絡先の詳細と誕生日を読み取るコードがあります。しかし、次の誕生日順に連絡先のリストを取得するにはどうすればよいでしょうか?

で識別される 1 人の連絡先について、次の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;
    }
4

5 に答える 5

1

私はこの解決策に行き着きました

  • 連絡先ID、名前、誕生日を保持するために、SQLiteデータベースにデータホルダーテーブルを作成しました
  • 誕生日が設定されている連絡先を読む
  • 誕生日の連絡先をテーブルに挿入します
  • 現在の誕生日がSQLで計算されるときにrawQueryを実行するカーソルを返します

そのため、最終的には、データベースから連絡先ID、表示名、誕生日を含むカーソルを希望の順序で取得することになりました。

于 2010-04-04T17:38:23.233 に答える
1

リストを誕生日で並べ替えてから、今日の日付を「ゼロの日付」として使用して、そのリストを2番目のリストにコピーすると思います。少し遅くなるかもしれませんが、適切なクエリを打ち出そうとするよりも、そのようにする方がクリーンなようです。

于 2010-03-22T17:31:39.790 に答える
1

私はこれを逆に行いました-誕生日を格納するデータテーブルを直接選択します。

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 は 2 回呼び出されます。1 回目は今日から 12/31 まで、2 回目は 01/01 から今日までです。返される行を 10 に制限していますが、これは必須ではありません。

編集:誕生日の日付はさまざまな形式で保存されているため、これはすべての Android フォンでは機能しないことがわかりました。したがって、すべての誕生日を (順不同で) ロードし、解析してメモリ内で並べ替える必要があります。#失敗

于 2010-08-29T14:42:29.730 に答える
0

おそらく、次の回答のように CursorJoiner を使用したいでしょう: http://www.mail-archive.com/android-developers@googlegroups.com/msg44317.html

私はまだ解決していない同様の問題を抱えているので、これを機能させることができるかどうかを知りたい.

于 2010-03-21T03:42:42.833 に答える
-1

getList() 内の query() の呼び出しで、並べ替えパラメーターを変更します。現在は DISPLAY_NAME に設定されています。TYPE_BIRTHDAY をお試しください。

于 2010-03-20T13:42:01.133 に答える