Android連絡先の2つを解剖し、2.1に基づいて


前回連絡先の表を全部開けて見て、何かを知りました.
今からプログラミングを始めます
連絡先からどのような情報を抽出しますか?
IDが無駄に見えるデータ
表示される名前
名前

(中間名は省けますが、中国人はほとんど使えません)
電話番号
もっと電話(家、仕事、など)
メール(自宅、仕事、など)
インスタント通信(QQ,MSN,Skype,Gtalk,など)
つうしんアドレス
ニックネーム
コメント
Webサイト
もっと重要なのはデータのバージョン番号です.前回見たフィールドversionです.
dataテーブルにversionフィールド、raw_contactsテーブルにversionフィールドがあり、contactsテーブルにはありません.
これにより、関連するデータを記録するためにテーブルを構築するだけで、ある時点で変化したデータを知ることができます.
もし牛が追い詰めるならば、HACK連絡先のデータベースについて、それにトリガをプラスして私達の表のデータを変更して、もちろん私達の表は連絡先のデータベースの中に置かなければならなくて、またOracleのようにDATABASE LINKを建てることができなくて、しかしこれは基本的に不可能です
話が遠くなった
APIで対応するフィールドを見つけてデータを読み出すのが主な任務です
前回、テーブルを分析したとき、raw_のようなidへの参照がたくさんあることがわかりました.contactsのcontact_idはcontactsのidを参照し、dataのraw_contact_idはraw_を引用したcontactsの_id、これは実は重要な情報です.
すべてのデータの中でcontactsは最初で、それは起源で、それ自体は多くのデータを持っていませんが、彼の役割は無視できません.
だから
ID              <---------->              ContactsContract.Contacts._ID
見てごらんContacts._IDの注釈も理解できるが、The unique ID for a row.INTEGER (long)
表示される名前<-------->ContactsContract.Contacts.DISPLAY_NAME
名<------->>ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME
姓<------->ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME
次の表のデータを見て、data表の中にデータがあります.
9|9|1|0|0|0|0|海郭|海|郭|郭|||郭|||||||
第3列はmimetypeに対応する、mimetypeテーブルを調べた後9はvndに対応する.android.cursor.item/name
IDとタイプで検索して、9列目と10列目のデータを取り出すだけでOKです.8列目は表示されている名前です
DATA 2(名)とDATA 3(姓)です
SDKはパッケージ化してくれましたCommonDataKinds.StructuredName.GIVEN_NAMEとContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME
では、連絡先データを読み出すコードは、次のようになります.
private List showContacts() {
		Cursor cursor = getContentResolver().query(
				ContactsContract.Contacts.CONTENT_URI, null,
				null, null, null);
		while (cursor.moveToNext()) {
			String contactId = cursor
					.getString(cursor
							.getColumnIndex(ContactsContract.Contacts._ID));

			String dn = cursor
					.getString(cursor
							.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
			Log.v("DISPLAY NAME", dn);

			// ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYP,      
			Cursor names = getContentResolver()
					.query(
							ContactsContract.Data.CONTENT_URI,
							null,
							ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID
									+ " =  ? AND "
									+ ContactsContract.Data.MIMETYPE
									+ " =  ?",
							new String[] {
									contactId,
									ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE },
							null);
			// + " AND " + ContactsContract.Data.MIMETYPE + " = 9"
			//         ,     ,  StructuredName   selectionArgs    ,         SQL ?

			while (names.moveToNext()) {
				//  
				String gn = names
						.getString(names
								.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
				Log.v("GIVEN NAME", gn);
				//  
				String fn = names
						.getString(names
								.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
				Log.v("FAMILY NAME", fn);
				//       
				String versions = names
						.getString(names
								.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DATA_VERSION));
				Log.v("DATA VERSION", versions);
			}
			names.close();

			//   RawContacts,        version,    

			Cursor raws = getContentResolver()
					.query(
							ContactsContract.RawContacts.CONTENT_URI,
							null,
							ContactsContract.RawContacts.CONTACT_ID
									+ " =  ?",
							new String[] { contactId, },
							null);

			while (raws.moveToNext()) {
				String rawVersion = raws
						.getString(raws
								.getColumnIndex(ContactsContract.RawContacts.VERSION));
				Log.v("RAW VERSION", rawVersion);
			}
			raws.close();

			String hasPhone = cursor
					.getString(cursor
							.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
			if ("1".equals(hasPhone)) {
				Cursor phones = getContentResolver()
						.query(
								ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
								null,
								ContactsContract.CommonDataKinds.Phone.CONTACT_ID
										+ " = "
										+ contactId,
								null, null);
				while (phones.moveToNext()) {
					String phoneNumber = phones
							.getString(phones
									.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
					Log.v("phone", phoneNumber);
				}
				phones.close();
			}
			Cursor emails = getContentResolver()
					.query(
							ContactsContract.CommonDataKinds.Email.CONTENT_URI,
							null,
							ContactsContract.CommonDataKinds.Email.CONTACT_ID
									+ " = "
									+ contactId,
							null, null);
			while (emails.moveToNext()) {
				String emailAddress = emails
						.getString(emails
								.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); //     Email  
				//    ADDRESS       ?Unhide in a separate CL
				Log.v("email", emailAddress);

				String version = emails
						.getString(emails
								.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA_VERSION));
				Log.v("email version", version);
			}
			emails.close();
		}
		cursor.close();
		return null;
	}