Android/SQLite操作通讯录数据库时如何解决PHONEBOOK排序规则缺失报错
安卓联系人数据库PHONEBOOK排序规则报错解决方案
1. PC端SQLite应用创建PHONEBOOK排序规则的方法
安卓系统的PHONEBOOK是安卓定制SQLite时内置的本地化联系人专用排序规则,普通PC端SQLite客户端默认没有集成该规则:
- 仅支持扩展加载的SQLite客户端可实现该需求,比如SQLite Studio、命令行版SQLite
- 你需要自行编写SQLite排序规则扩展,对齐安卓联系人的本地化排序逻辑(比如中文按拼音首字母排序、数字/特殊字符前置等),将扩展注册为
PHONEBOOK后加载到客户端即可使用 - 该方案实现成本高,不适合普通用户操作
2. 忽略排序规则校验的方法
无需修改表结构,单次执行SQL时显式指定通用排序规则即可绕过校验:
- 执行删除操作时使用语句:
DELETE FROM [raw_contacts] WHERE 1=1 COLLATE BINARY; - 执行插入操作时,涉及带
PHONEBOOK排序的字段后追加COLLATE BINARY即可,比如:INSERT INTO [raw_contacts] (display_name) VALUES ('张三' COLLATE BINARY); - 也可临时开启
PRAGMA ignore_check_constraints = ON;降低约束校验等级,操作完成后改回OFF即可
3. PHONEBOOK排序规则映射到PC端已有规则的方法
直接修改表字段的排序规则定义,批量替换所有PHONEBOOK为PC端已有的规则即可:
- 先查询所有带
PHONEBOOK排序的字段:SELECT * FROM sqlite_master WHERE sql LIKE '%COLLATE PHONEBOOK%'; - 针对每个对应字段执行修改语句,比如修改姓名字段:
ALTER TABLE raw_contacts MODIFY COLUMN display_name TEXT COLLATE BINARY; - 所有字段修改完成后,所有增删改查操作都不会再触发排序规则缺失报错,后续需要导回手机前,再把对应字段的排序规则改回
PHONEBOOK即可
4. 改为BINARY排序规则的后续影响
该操作不会引发严重的使用问题,分两种场景:
- 临时修改场景:你仅在PC端操作时改为BINARY,导回手机前已经把字段排序规则改回
PHONEBOOK,完全不会对手机端的联系人使用产生任何影响 - 未改回直接导回场景:即使你导回手机前没有修改回
PHONEBOOK,安卓系统读取联系人时会优先调用系统内置的PHONEBOOK规则做排序,不会出现数据丢失、联系人无法读取的问题,仅会出现在PC端查看数据时的排序顺序和手机端不一致的情况
内容的提问来源于stack exchange,提问作者trob
相关产品推荐
相关产品推荐

