CCUserDefaultAndroid.cpp存储问题


CCUserDefaultAndroid.cpp中为了兼容新旧版本的存储:即使用自己的UserDefault.xml和android上的sharepref,但在使用上不留神就会导致很严重的问题的。

背景:

在游戏中一般需要保存一些变量,比如说是否客气背景音等的用户设置。cocos2d-x中CCUserDefaultAndroid.ccp中是存储时操作的代码,其中把key和value保存在UserDefault.xml中。

问题:

在原有的模式是读取key是先判断这个key是否存在,无论这个值是string还是bool类的,如:

  lua中 if CCUserDefault:sharedUserDefault():getStringForKey("isBackGroundMusicPlaying") == "" 

在已有的改key的情况下,CCUserDefault::getStringForKey这个方法中调用CCUserDefault::setStringForKey的方法,在获取到对应的时,继续往下执行setStringForKeyJNI来回到android中保存这个key-value到share_pref中Cocos2dxPrefsFile.xml中,并且该条记录为string类型的。

因此假如你的记录为bool的情况下,这个判断会导致在android中保存这个key-value为string类型,当你下次调用setBoolForKey时,代码中会再次把相同的key-value保存的类型为bool类的,这个跟前面的保存为string类型产生冲突,一般情况log显示为“ Invalid indirect reference 0x40d07028 in decodeIndirectRef”等错误信息。

解决方法:

第一,可以选择直接在CCUserDefaultAndroid.cpp文件中把兼容的宏KEEP_COMPATABILITY取消定义,直接使用android的sharepref来存储。

第二,使用原来的存储,不用android的sharepref来存储,在setXXX的方法后面调用deleteNodeByKey后面return回去,不用调用后面的jni回调android那边的保存到sharepref中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值