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
では、連絡先データを読み出すコードは、次のようになります.
今からプログラミングを始めます
連絡先からどのような情報を抽出しますか?
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;
}