raw contact子表数据查询

本文深入探讨了Android系统中ContactsContract.RawContacts表的内部结构及其查询方法,详细解释了子表之间的关联和数据字段的含义,包括联系人数据的基本属性、与联系人状态更新的连接信息、与原始联系人的关联、与联系人数据的连接以及额外的数据源。文章还分析了查询结果中列数多于预期的原因,并提供了关键数据列的名称和用途概述。
RAW_CONTACT子表的查询很有意思。
RAW_CONTACT子表有很多。主要的有:
android.provider.ContactsContract.CommonDataKinds.StructuredName;
android.provider.ContactsContract.CommonDataKinds.Phone;
android.provider.ContactsContract.CommonDataKinds.Email;
android.provider.ContactsContract.CommonDataKinds.Organization;
我们可以通过以下形式来进行查询
//Setourexpandablelistadapter
String[]projection=newString[]{
Phone._ID,
Phone.DISPLAY_NAME,
Phone.NUMBER,
Phone.RAW_CONTACT_ID,
};

CursorcontactData=managedQuery(
Phone.CONTENT_URI,
null,//这里是查询所有的列。可以用projection代替来进行指定查询
null,
null,
null);
我用下面的语句打印出查询到所有列名
(注意用Email查询出的列一样,说明不同子表查的列数量一样,只是在DATA1到DATA15的意义不同)
intcolCount=contactData.getColumnCount();
for(inti=0;i<colCount;i++)
Log.i(TAG,i+"i:"+contactData.getColumnName(i));
但打印出来的列比我想象的多很多。我想Phone.CONTENT_URI是对应数据库的“视图”概念
查询所得一共有55列
一、子表本身数据,ContactsContract.Data中声明的25个列:
变量名列名备注
_ID_id
MIMETYPEmimetype
RAW_CONTACT_IDraw_contact_id
IS_PRIMARYis_primary
IS_SUPER_PRIMARYis_super_primary
DATA_VERSIONdata_version
DATA1~DATA15data1~data15
SYNC1~SYNC4data_sync1~data_sync4

二、和ContactsContract.StatusUpdates连接,所得的6项数据
变量名列名备注
PRESENCEmodePRESENCE_STATUS变量也是“mode”,但按照Data的文档是PRESENCE
STATUSstatusPRESENCE_CUSTOM_STATUS变量也是“mode”,但按照Data的文档应该是STATUS
STATUS_TIMESTAMPstatus_ts
STATUS_RES_PACKAGEstatus_res_package
STATUS_LABELstatus_label
STATUS_ICONstatus_icon
注意1:其实PRESENCE_STATUS和PRESENCE_CUSTOM_STATUS并没有在StatusUpdates申明的列当中。当然也就不可能被连接进来。
注意2:StatusUpdates共有11项数据,但还有5项数据没被连接进来。
他们是DATA_ID,PROTOCOL,CUSTOM_PROTOCOL,IM_HANDLE,IM_ACCOUNT。

三、连接RawContacts所得的11项目数据。
变量名列名备注
CONTACT_IDcontact_id
TIMES_CONTACTEDtimes_contacted
LAST_TIME_CONTACTEDlast_time_contacted
STARREDstarred
CUSTOM_RINGTONEcustom_ringtone
SEND_TO_VOICEMAILsend_to_voicemail
ACCOUNT_NAMEaccount_name
ACCOUNT_TYPEaccount_type
SOURCE_IDsourceid
VERSIONversion
DIRTYdirty
注意1:虽然RawContacts共拥有18项数据,但这里只包含了11项目。还有7项没被包含进来。
他们分别是_ID,AGGREGATION_MODE,DELETED,SYNC1~SYNC4
注意2:RawContactsColumns一共定义的三项目数据,但是只有一项CONTACT_ID被包含进来。
AGGREGATION_MODE和DELETED没有被包含进来
按照ContactsContract.Data中的文档,只有CONTACT_ID,AGGREGATION_MODE,DELETED三项会被包含来的啊。
但实际并非如此。WHY?

四、连接Contacts所得的9项目数据。
变量名列名备注
LOOKUP_KEYlookup
PHOTO_IDphoto_id
IN_VISIBLE_GROUPin_visible_group
CONTACT_PRESENCEcontact_presence
ONTACT_STATUScontact_status
CONTACT_STATUS_TIMESTAMPcontact_status_ts
CONTACT_STATUS_RES_PACKAGEcontact_status_res_package
CONTACT_STATUS_LABELcontact_status_label
CONTACT_STATUS_ICONcontact_status_icon
注意1:虽然RawContacts共拥有17项数据,但这里只包含了9项目。还有8项没被包含进来。
他们分别是:_ID,NAME_RAW_CONTACT_ID,DISPLAY_NAME_PRIMARY,TIMES_CONTACTED,
LAST_TIME_CONTACTED,STARRED,CUSTOM_RINGTONE,SEND_TO_VOICEMAIL
注意2:在RawContacts和Contacts中都有一个名叫TIMES_CONTACTED的变量名,且他们的列名都为“times_contacted”。
参照TIMES_CONTACTED在两个类的中的定义,
Contacts中TIMES_CONTACTED值为Contacts组中所有RawContacts的TIMES_CONTACTED值的最大值。
所以查询所得名叫times_contacted的列应该是对于RawContacts的TIMES_CONTACTED。
LAST_TIME_CONTACTED同理。
注意3:STARRED参照定义也可知查询所得名叫STARRED的列应该是对于RawContacts的STARRED。
注意4:对于CUSTOM_RINGTONE和SEND_TO_VOICEMAIL,在RawContacts和Contacts的列中都有对他们的申明,且它们的定义也相同。
参照它们的定义文档来看也不是很清楚。
但我们这里主要是针对RawContacts的查询,我想他们应该是来自于RawContacts,而不是Contacts。
注意5:对于TIMES_CONTACTED,LAST_TIME_CONTACTED,STARRED,CUSTOM_RINGTONE,SEND_TO_VOICEMAIL
然参照ContactsContract.Data文档他们是被Contacts连接进来,
但通过以上分析,他们没有Contact连接进来。而是通过RawContacts连接进来。

五、Data.GroupMembership的一项数据。
变量名列名备注
GROUP_SOURCE_IDgroup_sourceid
这个数据应该是通过连接Data.GroupMembership所得的。但是文档中并没说明
六,未确定来源数据2项
列名备注
display_name
res_package
注意1:display_name可能来自ContactsColumns的DISPLAY_NAME,及来自于Conact.
但关于Conact的DISPLAY_NAME来自于数据库的哪里还是puzzle.可能来自于DISPLAY_NAME_PRIMARY。
为什么不能直接查询Contacts的DISPLAY_NAME_PRIMARY?也是个puzzle.
注意2:res_package来自哪里?没任何线索。
<think>好的,用户的问题是如何分割和增强JSON数据,需要具体的处理方法、示例和代码实现。首先,我需要理解这两个操作的具体含义。分割JSON数据可能指的是将一个大的JSON对象拆分成多个小部分,或者根据某个条件分离出不同的数据块。而增强处理可能包括添加新字段、修改现有数据或丰富数据内容等。 接下来,我需要考虑用户可能的场景。用户可能是在处理来自API的JSON响应,或者处理存储在数据库中的JSON数据,比如PostgreSQL中的JSON字段。根据用户提供的引用,他们提到了PostgreSQL和Unity中的JSON处理,以及GitHub API的JSON解析,所以可能需要涵盖不同环境下的处理方法。 首先,分割JSON数据的方法可能包括按结构分割、按条件过滤或分页处理。例如,在Python中可以使用字典操作来提取子对象;在PostgreSQL中可以使用JSON函数来拆分数据。增强处理可能包括合并数据、添加计算字段或数据标准化。例如,添加时间戳或计算BMI指数。 然后,需要提供代码示例。对于Python,可以使用json库或内置的字典操作;对于PostgreSQL,可以使用JSONB函数。同时,要确保示例清晰,并说明每一步的作用。比如分割时,如何提取嵌套的JSON部分;增强时如何添加新字段。 还需要考虑用户可能遇到的常见问题,例如如何处理嵌套结构,或者如何高效地处理大量数据。此外,引用用户提供的参考资料,如PostgreSQL的JSON处理和LitJson库的使用,可以增强回答的权威性。 最后,要确保回答结构清晰,分步骤说明,并提供多种环境下的解决方案,满足不同用户的需求。同时,生成的相关问题要围绕数据处理的其他方面,如性能优化、验证和数据库操作,帮助用户进一步学习。</think># JSON数据分割与增强处理方法 ## 一、JSON数据分割方法 1. **按结构分割**:将嵌套结构拆分为独立子对象 ```python import json original_data = { "user": { "profile": {"name": "John", "age": 30}, "preferences": {"theme": "dark", "language": "zh"} } } # 分割用户配置数据 profile_data = json.dumps(original_data["user"]["profile"]) preferences_data = json.dumps(original_data["user"]["preferences"]) ``` 2. **条件过滤分割**:基于特定条件分离数据 ```python dataset = [ {"id": 1, "value": 85, "category": "A"}, {"id": 2, "value": 42, "category": "B"}, {"id": 3, "value": 90, "category": "A"} ] # 按类别分割数据 category_a = [item for item in dataset if item["category"] == "A"] category_b = [item for item in dataset if item["category"] == "B"] ``` 3. **分页处理**:适用于大型数据集(PostgreSQL示例) ```sql -- 使用JSONB函数进行分页处理 SELECT jsonb_array_elements(data->'items') FROM large_dataset ORDER BY (jsonb_array_elements(data->'items')->>'id')::int LIMIT 10 OFFSET 20; ``` ## 二、JSON数据增强方法 1. **数据合并增强** ```python user_data = {"name": "Alice", "age": 28} system_data = {"timestamp": "2023-07-20", "source": "web"} # 合并元数据 enhanced_data = {**user_data, "metadata": system_data} ``` 2. **计算字段添加** ```python health_data = {"height": 1.75, "weight": 68} # 添加BMI计算 health_data["bmi"] = round( health_data["weight"] / (health_data["height"] ** 2), 2 ) ``` 3. **数据标准化处理** ```python def standardize_phone(data): phone = data.get("phone", "") if len(phone) == 11: return f"{phone[:3]}-{phone[3:7]}-{phone[7:]}" return phone contact = {"name": "Bob", "phone": "13812345678"} contact["phone"] = standardize_phone(contact) ``` ## 三、综合应用示例 ```python # 原始数据 raw_json = ''' { "transactions": [ {"id": 1, "amount": 150, "currency": "USD"}, {"id": 2, "amount": 2000, "currency": "JPY"}, {"id": 3, "amount": 75, "currency": "EUR"} ] } ''' # 处理流程 data = json.loads(raw_json) # 1. 分割货币类型 usd_transactions = [t for t in data["transactions"] if t["currency"] == "USD"] other_transactions = [t for t in data["transactions"] if t["currency"] != "USD"] # 2. 汇率转换增强 exchange_rates = {"USD": 1, "JPY": 0.0075, "EUR": 1.18} for transaction in data["transactions"]: transaction["amount_usd"] = round( transaction["amount"] * exchange_rates[transaction["currency"]], 2 ) # 3. 添加审计信息 enhanced_data = { "processed_at": datetime.now().isoformat(), "original_count": len(data["transactions"]), "transactions": data["transactions"] } print(json.dumps(enhanced_data, indent=2)) ``` ## 四、性能优化建议 1. 使用流式处理处理大型JSON文件(如ijson库) 2. 对重复操作使用JIT编译(如PyPy解释器) 3. PostgreSQL中优先使用JSONB类型进行高效查询[^1] 4. 复杂数据结构处理推荐使用LitJson等专用库[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值