我很是想把一些非必需的信息以CSV表的格式保存到客戶端,以減小和服務器的通信,下降壓力。因而寫了這麼一個。php
但由於你們以爲這樣的話,須要每次登錄時來檢測同步這些數據,會減慢登錄速度,因而沒有用到。服務器
我以爲往後服務器壓力增大了之後,能夠這麼使用。app
整體上是兩部分: 加密和讀取。svn
1 加密ui
使用quick自帶的pack_files命令加密CSV文件。在quick\bin\pack_files.bat 具體使用方法可進去查看sample.加密
啓動程序時,告訴lua堆棧加密的密鑰等。lua
具體代碼以下spa
打包時處理csv文件,記住yourkey yoursign 這是你本身設置的。code
echo - encrypt res\csv\*.* to res\csvnew\ %QUICK_V3_ROOT%\quick\bin\win32\php.exe %QUICK_V3_ROOT%\quick\bin\lib\pack_files.php -i %APP_ANDROID_ROOT%assets\res\csv -o %APP_ANDROID_ROOT%assets\res\csvnew -es XXTEA -ek yourkey -es yoursign if exist "%APP_ANDROID_ROOT%assets\res\csv" rmdir /s /q "%APP_ANDROID_ROOT%assets\res\csv" ren %APP_ANDROID_ROOT%assets\res\csvnew csv
AppDelegate.cpp中告訴C++你使用的key和sign, 7, 8分別是兩個字符串的長度。blog
LuaStack *pStack = pEngine->getLuaStack(); pStack->setXXTEAKeyAndSign("yourkey", 7, "yoursign", 8);
2 讀取。大概的思路是咱們要從res目錄下讀取文件,並且這個文件是加密過的。
因此要注意如下兩點:
文件全路徑獲取方法是用的是 cc.FileUtils:getInstance():fullPathForFilename()
讀取文件內容時方法是 cc.HelperFunc:getFileData()
具體代碼以下
單獨的loader目錄用來加載全部的文件。myapp.lua中,增長調用入口
require("app.loader.init")
init.lua
LoaderPath = "csv/" import(".LoaderA").new() import(".LoaderB").new()
某一個LoaderA.lua
local CSVReader = require("utils.CSVReader").new() local LoaderA = class("LoaderA") function LoaderA:ctor() self.fn = "A.csv" self.items = {} self:load() end function LoaderA:load() self.rows = CSVReader:load(LoaderPath..self.fn) if not self.rows then return end local len = #self.rows for i = 1, len do local item = self.rows[i] self:parseColumn(item) end printInfo("LoaderA end: %d ", len) end function LoaderA:parseColumn(itemArr) local info = {} info.column1 = checkint(itemArr[1]) info.column2 = itemArr[2] or "" info.column3 = checkint(itemArr[3]) self.items[#self.items+1] = info end return LoaderA
CSVReader.lua
local CSVReader = class("CSVReader") function CSVReader:ctor() end function CSVReader:load(filename) self.fn = cc.FileUtils:getInstance():fullPathForFilename(filename) local fileExits = cc.FileUtils:getInstance():isFileExist(self.fn) if not fileExits then printError("file not exist %s", self.fn) return nil end -- 這裏使用cc.HelperFunc:getFileData() 而非 cc.FileUtils:getInstance():getStringFromFile(self.fn) -- 就是由於加密了 local str = cc.HelperFunc:getFileData(self.fn) return self:parse(str) end function CSVReader:parse(str) local content = {} local list = string.split(str, "\r\n") if #list <= 1 then return content end table.remove(list, 1) -- 第一行是各字段說明 for i = 1, #list do local linestr = string.ltrim(list[i]) if string.sub(linestr, 1, 1) ~= "#" then -- #開頭的行爲註釋行 local rows = string.split(linestr, ",") content[#content + 1] = rows end end return content end return CSVReader
A.csv
#column1,#column2,#column3,
10000,lang10000,1,
10001,lang10001,1,
10002,lang10002,1,
10003,lang10003,1,