悲剧的账户绑定与通讯录丢失实录

事情是这样的,做一个实验需要两个android手机;于是将朋友的一个android手机借来用了;
因为需要设置一个gmail帐号才能从android market上下载软件,朋友的手机没有设置(他也没gmail帐号),所以就将我的gmail帐号绑定了,结果还是没下载成功,android market识别的机子仍然是我的M9(貌似每个账户只能使用一台机器呢)。但更悲剧的是:在还手机之前想将我的帐号删除掉,发现尽然删除不了,提示说必 须通过恢复出场设置才能删除。(搜了一下才知道原来添加的第一个帐号确实删除不了,第二个,第三个...应该就可以删除了)

恢复出厂设置的代价肯定就是丢失所有数据,这肯定是不可行的(事后证明还不如这么干算了,免得后面白折腾了一个下午~)于是上网搜了一下,找到一个办法:就是通过删除data/system/accounts.db的方法实现。(该方法链接: android3g.diandian.com/post/2011-11-04/6494916 )

通过adb shell进去后,将该文件改名了(data/system/accounts.db.bak)

然后重启手机后发现确实账户已经没有了,但悲剧的是朋友的通讯录也没了。。。(好几百个号码呢)!

于是重新adb shell进去再将之前备份的文件改回来,重启后账户是恢复回来了,但通讯录仍然没有!

论坛发贴求助时有网友提示应该将文件的权限设置与其它文件一致(需要ROOT,朋友的这款是改装机,默认已经root):

$adb shell
#cd /data/system/
#chown system.system accounts.db
#chmod 664 accounts.db
#exit

重启依然没有起色。

然后就是检查通讯录所在的数据库文件了:/data/data/com.android.providers.contacts/databases/contacts2.db
但确实没有了。。。

附上sqlit操作记录:

$ adb pull /data/data/com.android.providers.contacts/databases/contacts2.db contacts2.db (将数据库文件导出到本地)
$ sqlite3 contacts2.db (打开数据库)
sqlite> .tables (列出表)
sqlite> s-e-l-e-c-t * from contacts; (输出表数据)
sqlite> .quit (退出sqlite)

其中calls是通话记录表,contacts是通讯录表,data是通讯录子表。(参见:hi.baidu.com/yfldyxl/blog/item/77e424d7c23570cba044df6d.html

通过上面折腾,附上权威的不必恢复原厂设置也能删除已添加的Gmail账户方法(测试前一定要先备份!!):

adb pull /data/system/accounts.db accounts.db
sqlite3 d:/accounts.db
s-e-l-e-c-t * from accounts;
.schema
delete from accounts where _id=1; (注意:这里的id根据实际显示进行更改)
adb push d:/accounts.db /data/system/accounts.db (将更改后的数据库再导入到手机)

详细参见:leidiqiu.iteye.com/blog/1041490
squlit操作命令:wenku.baidu.com/view/48680b1ba8114431b90dd863.html

对Android用户如下建议:
1. 不时的使用豌豆夹进行备份
2. 注册一个gmail帐号用于同步(不要使用别人的帐号,自己的帐号也不要在他人机器上绑定)
3. 在验证网络上的方法前一定要记得备份!

原文地址:https://www.cnblogs.com/wzc0066/p/2948360.html