本方法 Moto X 2014(欧版 XT1092 Android 6.0 MPE24.49-18)升级到 Lineage 14.1(XT1092 Android7.1.1)测试可以,应该是通用的,扩展一下的话,所有用数据库存储的短信都可以这样导出导入
大概呢就是这么个流程导致产生了这个不简单但是很粗暴的备份方法
- 感觉手机不太好用了,于是乎索性把系统升级成 Lineage 14.1,当然升级前各种数据都钛备份了
- 升级后发现钛备份没办法恢复短信,发现短信文件夹被移到了
/data/user_de/0/com.android.providers.telephony/
- 手动恢复好像也没用,估计大概是数据库有了些变更吧,短信程序又不晓得为什么没有升级数据库
- 试了下各种软件来备份恢复数据,结果发现好多短信备份软件对于超长的短信(就是100多个字当一条发送的那种)都备份不了,最后会截断成乱码,而且还没办法备份彩信
- 于是乎决定直接复制数据库这个简单粗暴的方法来解决问题
大概这么几个步骤,还是需要一些电脑知识的,小白就不用考虑了,小白应该也不会有备份短信的需求吧
- 先把 Android 6.0
/data/data/com.android.providers.telephony/
这个保存彩信短信的文件夹弄到D:sms
,操作手机上的文件一般推荐用 Root Explorer - 为了便于区分呢把
mmssms.db
重命名为mmssms-old.db
- 安装 Android 7.1 后把
/data/user_de/0/com.android.providers.telephony/databases/mmssms.db
也复制到D:sms
- 下载个 Navicat Premium 打开两个短信数据库一个表一个表对比差别,有个方便的比较方法,使用查询创建工作分别生成 SQL 查询语句,放到 Excel 里面对比就知道那些列多那些列少了
- 通过设计表把
mmssms-old.db
中表结构改成和mmssms.db
一样,一般就是删除一些列啊,增加一些列啊,看到有个功能叫结构同步但是用不了 - 表
sms
保存所有的短信,通过thread_id
关联threads
表,删除列failure_cause
,stack_type
,callback_number
,将pri
改成priority
,还可以执行UPDATE sms SET person = NULL
, - 表
threads
保存所有会话,没有这个大部分短信程序无法显示短信,但是可以正常备份短信,通过recipient_ids
关联canonical_addresses
,增加两列:attachment_info
TEXT 类型,notification
INTEGER 类型,默认值为0 - 表
canonical_addresses
保存会话联系人号码,很重要,决定一个会话中消息发给谁,而且通过他让系统认识到+8615012345678
15012345678
150 1234 5678
是同一个人,没有的话会显示未知发件人,根据系统设置,群发消息可能把不同号码也分成一组 - 表
pdu
存储彩信信息,删除列image_resize_status
- 表
part
存储彩信媒体内容,删除列_display_name
、_size
,执行下面两句修改媒体文件位置UPDATE part SET _data = REPLACE ( _data, '/data/user/0/', '/data/user_de/0/' )
UPDATE part SET _data = REPLACE ( _data, '/data/data/', '/data/user_de/0/' )
- 利用数据同步功能同步表
sms
、threads
、canonical_addresses
、pdu
、part
,为什么表内容一样了还要同步,因为还有索引啊,触发器啊,视图啊万一有不一样的呢,所以为了省事,只单纯的把数据搞过去就好了 - 把
mmssms.db
复制到/data/user_de/0/com.android.providers.telephony/databases/
并更改权限为0660
,所有者和用户组均为radio
- 把
com.android.providers.telephony/app_parts
也复制过去并设置权限0766
,所有者和用户组均为radio
- 重启手机,你的短信彩信就都回来了