--[[ 本地数据存储,分为两类: 1、设备级别的数据,保存和设备有关的数据,比如性能档位等,这些数据会在所有用户之间共享 2、用户级别的数据,和账号ID绑定,不同用户角色之间的数据相互不影响 解析本地数据 local Infrast = require("Infrast/Infrast") local path = "Storage/PlayerData" if LuaExt.FileExists(path) then local content = Infrast.DecodeFromBytes(LuaExt.FileReadBytes(path)) LuaExt.FileWriteText(path .. ".txt", require("cjson").encode(content)) end ]] local PersistentData = {} local Storage = require("Tools/Storage") --获取存储数据值,如果没有返回defaultValue local function Get(self, key, defaultValue) return Storage.GetValue(self.storageHandle, key, defaultValue) end --设置存储数据值 local function Set(self, key, value, isImmediatelySave) return Storage.SetValue(self.storageHandle, key, value, isImmediatelySave) end --删除存储数据值 local function Remove(self, key, isImmediatelySave) return Storage.RemoveValue(self.storageHandle, key, isImmediatelySave) end --删除存储数据值,不要调用 local function RemoveAll(self) return Storage.RemoveAllValue(self.storageHandle) end --保存数据到文件 local function Save(self) Storage.Save(self.storageHandle) end --初始化数据 local function InitStorageData(storageKey) return { storageHandle = Storage.OpenOrCreate(storageKey), Get = Get, Set = Set, Remove = Remove, RemoveAll = RemoveAll, Save = Save, } end --初始化设备本地数据,存储设备有关的数据,比如lod,推送通知等 PersistentData.DeviceData = InitStorageData("DeviceData") --初始化玩家本地数据,登录后才可以使用 PersistentData.PlayerData = nil --更新玩家的accid的接口 function PersistentData.SetPlayerAccid(currAccid) if currAccid then local playerDataIndex = PersistentData.DeviceData:Get("LocalPlayerDataIndex", {}) local dataIndex = playerDataIndex[currAccid] if dataIndex then --加载存储过的玩家数据 PersistentData.PlayerData = InitStorageData("PlayerData"..dataIndex) PersistentData.DeviceData:Set("lastLoginAccid", currAccid, true) else --新建玩家数据存储 local dataIndex = 0 for k, v in pairs(playerDataIndex) do dataIndex = math.max(dataIndex, v) end dataIndex = dataIndex + 1 PersistentData.PlayerData = InitStorageData("PlayerData"..dataIndex) PersistentData.PlayerData:Set("accid", currAccid, true) playerDataIndex[currAccid] = dataIndex PersistentData.DeviceData:Set("lastLoginAccid", currAccid) PersistentData.DeviceData:Set("LocalPlayerDataIndex", playerDataIndex, true) end end end --尝试进行数据迁移,待版本上线一段时间后可以移除 if LuaExt.FileExists("Storage/PlayerData") then local playerData = InitStorageData("PlayerData") local savedAccid = playerData:Get("accid") if savedAccid then local playerDataIndex = PersistentData.DeviceData:Get("LocalPlayerDataIndex", {}) if playerDataIndex[savedAccid] then --跳过已经存储的重名数据 else --新建玩家数据存储 local dataIndex = 0 for k, v in pairs(playerDataIndex) do dataIndex = math.max(dataIndex, v) end dataIndex = dataIndex + 1 --注册并迁移到新的命名 playerDataIndex[savedAccid] = dataIndex PersistentData.DeviceData:Set("LocalPlayerDataIndex", playerDataIndex, true) local bytes = LuaExt.FileReadBytes("Storage/PlayerData") LuaExt.FileWriteBytes("Storage/PlayerData"..dataIndex, false, bytes) end end --淘汰旧的文件 LuaExt.FileDelete("Storage/PlayerData") end return PersistentData