解决Android下QtQuick.LocalStorage和腾讯开放平台组件冲突问题
已经有将近一个月没有写博客了,其实这段时间还是非常努力地进行开发的活动。最近也是在开发的过程中遇到了好一些问题,这些问题可以为自己或者是同行们提供一些启示或者是指导,所以我有必要记录下来,供大家参考。
现象:我在Android上使用QtQuick的LocalStorage模块,但是发现我不管如何正确地使用SQL语句插入项目,下次读取的时候,总是显示数据库的相关表不存在。
这个错误真的很诡异。我还专门写了一个例子程序,在Android两台设备上运行,结果都是没有问题的。最终例子程序是没有问题的,但是项目是有很大问题的。这究竟是怎么一回事呢?
当时我真的很想进入Android系统使用相关软件查看一下SQLite的相关数据。不过Eclipse的DDMS在我的红米手机上,看不到/data/data这个目录,真是非常气恼。还好,我还有一台设备是root过了的,我就用另外一台Android设备查看/data/data/com.qtdream.com文件夹中究竟发生了什么事。结果发现,当程序启动的时候,/data/data/com.qtdream.app/files文件夹是存在的,当程序结束时,/data/data/com.qtdream.app/files文件夹就删除了。后面我仔细看了一下,files里面除了Qt的相关文件夹,竟然出现了腾讯的相关软件!如下图:
这是程序运行时候的截图:
这个是程序结束后的截图
原因找到了!
原因:因为我接入了腾讯的开放平台,在开始的时候,这个插件也向/data/data/com.qtdream.app/files写入文件,当程序结束的时候,它顺便把这个files文件夹删除掉了!
腾讯真是过河拆桥啊。不管文件夹里还有其它文件,一个劲儿就删除了files这个文件夹!害得我查找错误半天。
解决办法就是单独设置一个离线文件的路径。我在main.cpp中是这么写的:
#ifdefined( Q_OS_ANDROID ) && !defined( Q_OS_ANDROID_NO_SDK )
// 2015年11月01日19:07:02
// 由于存在Android系统上腾讯的开放平台登录组件在程序结束的时候会删除
// /data/data/com.qtdream.app/files这个文件夹,因此需要重新设定离线存储位置。
// Default to"/data/data/com.qtdream.app/files/QML/OfflineStorage"
// Will alter to "/data/data/com.qtdream.app/offlineStorage"
QString offlineStoragePath =
engine.offlineStoragePath( ).
replace("files/QML/OfflineStorage", "offlineStorage" );
QDir( offlineStoragePath ).mkpath("." );
engine.setOfflineStoragePath(offlineStoragePath );
#endif
这回真是吃一堑长一智了。