WEBAPP開發MUI框架下一個簡單的JS模仿redis的資料儲存外掛
阿新 • • 發佈:2018-12-12
開發環境:HBuder工具 + mui框架
公司開發APP一直使用的webApp的方式進行,這樣既可以不用額外招聘安卓和ios開發外,還可以不用頭疼各種解析度相容的問題。
之前有個APP有個需求是需要將某些使用者資料儲存到手機,並且不能被使用者主動刪除的那種,如果用快取,肯定是不能滿足要求的,後來我用js模擬了一個簡單的類似於redis的資料儲存外掛。下面附上程式碼 [有使用案例]:
/** * 移動端的資料儲存操作的工具類[移動端的一個小型的本地資料庫] * 主要的方式是檔案操作和自動解析 * * 資料庫的資料存貯格式為 鍵值對 方式,類似PC端的 redis * * 外掛作者:孫帥 * 開發時間:2017-05-04 * * * new CwAppDB().InsertOrUpdate(table,key,value); * 資料的插入或更新,傳入一個表名,key值,以及key對應的value值。儲存成功不會有任何提示,儲存失敗會彈出"資料儲存出錯" * 【注,因為檔案操作為非同步,所以同一時間(1-2秒內)只能呼叫一次InsertOrUpdate方法,否則只會是最後一個方法有效】 * * * new CwAppDB().SelectKey(table,key,OnSelectOver); * 資料的查詢操作,傳入一個表名,key值,以及接收查詢結果的回撥方法 OnSelectOver(key,value), * 回撥方法有兩個引數,第一個是查詢的key值,第二個是接收查詢到的結果,查詢的時候,請在回撥方法中處理查詢結果 * * * new CwAppDB().DeleteKey(table,key); * 資料的刪除操作,傳入一個表名,和一個key值,若在庫中找到了該值,則刪除,否則不進行任何操作 * * * new CwAppDB().InsertOrUpdateArry(table,keys,values); * 資料庫的批量新增操作,傳入一個表名和一個key值陣列 以及一個value值陣列。注意,key值和對應的value值的下標一定要對應 * * * new CwAppDB().DeleteKeyArry(table,keys); * 資料的批量刪除操作,傳入一個表名,和一個key值陣列 * * * new CwAppDB().SelectAll(table,OnSelectOver); * 資料的全表查詢,傳入一個表名,和一個回撥方法, * 返回一個JSON陣列格 * * * new CwAppDB().SelectToValue(table,keyword,OnSelectOver); * 查詢資料庫value值中包含某個關鍵字的所有的資料,傳入表名,查詢關鍵字,回撥方法, * 返回一個JSON陣列格 */ !(function(){ window.CwAppDB = function(){ mui.init({}); } CwAppDB.prototype={ InsertOrUpdate: function(table,key,value,OnSelectOver){//儲存資料【key不存在的時候是新增,存在的時候是修改】。table:表名 key和value只能是字串,不能有特殊符號 OnSelectOver:回撥方法 key=key.replace('>','').replace('<','').replace('\\',''); value=value.replace('>','').replace('<','').replace('\\',''); mui.plusReady(function() { plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function( fs ) { fs.root.getFile('DB/'+table+'.cdb',{create:true}, function(fileEntry){ fileEntry.file( function(file){//建立一個檔案讀寫物件,檔案沒有的時候建立一個新的 var fileReader = new plus.io.FileReader(); fileReader.readAsText(file, 'utf-8'); fileReader.onloadend = function(evt) { // alert(evt.target.result);//檔案內容 if(evt.target.result!=""){ var keysValues=evt.target.result.split("\r\n"); for(var i=0;i<keysValues.length;i++){ if(keysValues[i]!=""){ var KV=keysValues[i].split(">"); if(KV[0]==key){//有重複,直接修改 keysValues[i]=key+'>'+value; var DataStr=keysValues.join("\r\n"); fileEntry.createWriter( function (writer) {//開始寫入檔案 (覆蓋式寫入) writer.write(DataStr); if (typeof OnSelectOver === "function"){ OnSelectOver("success");//呼叫回撥方法 } }, function ( e2 ) { alert("資料儲存出錯"); }); return; } } } } //能繼續執行到這裡的,代表沒有重複,直接新增 fileEntry.createWriter( function (writer) {//開始寫入檔案 (覆蓋式寫入) // writer.seek( writer.length-1 );//定位到末尾 // writer.write(key+'>'+value+'\r\n');//追加寫入[這種方法對換行的內容有問題,直接在後面去掉所有的換行] var DataCentent=(evt.target.result+key+'>'+value+'\r\n').replace('\r\n\r\n','\r\n');//重新組裝全部的資料內容 writer.write(DataCentent);//一次性更新所有的內容,覆蓋式寫入 if (typeof OnSelectOver === "function"){ OnSelectOver("success");//呼叫回撥方法 } }, function ( e2 ) { alert("資料儲存出錯"); }); } }); }); }, function ( exp ) { alert("資料儲存出錯"); }); }); },SelectKey: function(table,key,OnSelectOver){//查詢資料。table:表名 OnSelectOver:查詢完畢之後的回撥函式 key=key.replace('>','').replace('<','').replace('\\',''); mui.plusReady(function() { try{ plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function( fs ) { fs.root.getFile('DB/'+table+'.cdb',{create:true}, function(fileEntry){ fileEntry.file( function(file){//建立一個檔案讀寫物件,檔案沒有的時候建立一個新的 var fileReader = new plus.io.FileReader(); fileReader.readAsText(file, 'utf-8'); fileReader.onloadend = function(evt) { //alert(evt.target.result);//檔案內容 var DataCentent=evt.target.result; var SelStr="";//接收查詢到的結果的變數 if(DataCentent!=""){ var keysValues=DataCentent.split("\r\n"); for(var i=0;i<keysValues.length;i++){ if(keysValues[i]!=""){ var KV=keysValues[i].split(">"); if(KV[0]==key){ SelStr=KV[1]; break; } } } } if (typeof OnSelectOver === "function"){ OnSelectOver(key,SelStr);//呼叫回撥方法 } } }); }); }, function ( exp4 ) { alert("資料讀取出錯"); }); }catch(e3){ alert("資料讀取出錯"); } }); },DeleteKey: function(table,key){//刪除操作 table:表名 key:要刪除的鍵值,不能有特殊符號 key=key.replace('>','').replace('<','').replace('\\',''); mui.plusReady(function() { plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function( fs ) { fs.root.getFile('DB/'+table+'.cdb',{create:true}, function(fileEntry){ fileEntry.file( function(file){//建立一個檔案讀寫物件,檔案沒有的時候建立一個新的 var fileReader = new plus.io.FileReader(); fileReader.readAsText(file, 'utf-8'); fileReader.onloadend = function(evt) { if(evt.target.result!=""){ var keysValues=evt.target.result.split("\r\n"); for(var i=0;i<keysValues.length;i++){ if(keysValues[i]!=""){ var KV=keysValues[i].split(">"); if(KV[0]==key){//key值存在,直接清掉 keysValues[i]=""; var DataStr=keysValues.join("\r\n").replace('\r\n\r\n','\r\n'); fileEntry.createWriter( function (writer) {//開始寫入檔案 (覆蓋式寫入) writer.write(DataStr); }, function ( e2 ) {alert("資料儲存出錯"); }); } } } } } }); }); }, function ( exp ) { alert("資料儲存出錯"); }); }); },InsertOrUpdateArry: function(table,keys,values){//一次性插入多條資料 mui.plusReady(function() { plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function( fs ) { fs.root.getFile('DB/'+table+'.cdb',{create:true}, function(fileEntry){ fileEntry.file( function(file){//建立一個檔案讀寫物件,檔案沒有的時候建立一個新的 var fileReader = new plus.io.FileReader(); fileReader.readAsText(file, 'utf-8'); fileReader.onloadend = function(evt) { if(evt.target.result!=""){//該表中有資料 var keysValues=evt.target.result.split("\r\n");//得到所有的鍵值對資料陣列 for(var k=0;k<keys.length;k++){ keys[k]=keys[k].replace('>','').replace('<','').replace('\\',''); values[k]=values[k].replace('>','').replace('<','').replace('\\',''); var numInd=0;//重複次數 for(var i=0;i<keysValues.length;i++){ if(keysValues[i]!=""){ var KV=keysValues[i].split(">"); if(KV[0]==keys[k]){//有重複,直接修改 keysValues[i]=keys[k]+'>'+values[k]; numInd++;//標註為修改,記重複一次 break; } } } if(numInd==0){//沒有重複,則新增 keysValues[keysValues.length]=keys[k]+'>'+values[k]; } } var DataStr=keysValues.join("\r\n"); fileEntry.createWriter( function (writer) {//開始寫入檔案 (覆蓋式寫入) writer.write(DataStr); }, function ( e2 ) {alert("資料儲存出錯"); }); }else{//當前表中沒有資料的直接就覆蓋寫入所有的鍵值對資料 var Arr=[]; for(var k=0;k<keys.length;k++){ Arr[k]=keys[k]+">"+values[k]; } var DataStr=Arr.join("\r\n"); fileEntry.createWriter( function (writer) {//開始寫入檔案 (覆蓋式寫入) writer.write(DataStr);//一次性儲存所有的內容,覆蓋式寫入 }, function ( e2 ) {alert("資料儲存出錯"); }); } } }); }); }, function ( exp ) { alert("資料儲存出錯"); }); }); },DeleteKeyArry: function(table,keys){//批量刪除操作 table:表名 keys:要刪除的鍵值陣列,不能有特殊符號 mui.plusReady(function() { plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function( fs ) { fs.root.getFile('DB/'+table+'.cdb',{create:true}, function(fileEntry){ fileEntry.file( function(file){//建立一個檔案讀寫物件,檔案沒有的時候建立一個新的 var fileReader = new plus.io.FileReader(); fileReader.readAsText(file, 'utf-8'); fileReader.onloadend = function(evt) { if(evt.target.result!=""){ var keysValues=evt.target.result.split("\r\n"); for(var k=0;k<keys.length;k++){ keys[k]=keys[k].replace('>','').replace('<','').replace('\\',''); for(var i=0;i<keysValues.length;i++){ if(keysValues[i]!=""){ var KV=keysValues[i].split(">"); if(KV[0]==keys[k]){//key值存在,直接清掉 keysValues[i]=""; break; } } } } var DataStr=keysValues.join("\r\n").replace('\r\n\r\n','\r\n'); fileEntry.createWriter( function (writer) {//開始寫入檔案 (覆蓋式寫入) writer.write(DataStr); }, function ( e2 ) {alert("資料儲存出錯"); }); } } }); }); }, function ( exp ) { alert("資料儲存出錯"); }); }); },SelectAll:function(table,OnSelectOver){ mui.plusReady(function() { try{ plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function( fs ) { fs.root.getFile('DB/'+table+'.cdb',{create:true}, function(fileEntry){ fileEntry.file( function(file){//建立一個檔案讀寫物件,檔案沒有的時候建立一個新的 var fileReader = new plus.io.FileReader(); fileReader.readAsText(file, 'utf-8'); fileReader.onloadend = function(evt) { //alert(evt.target.result);//檔案內容 var DataCentent=evt.target.result; var SelJsonStr=[];//接收查詢到的結果的變數 if(DataCentent!=""){ var keysValues=DataCentent.split("\r\n"); for(var i=0;i<keysValues.length;i++){ if(keysValues[i]!=""){ var KV=keysValues[i].split(">"); SelJsonStr.push({"key":KV[0],"value":KV[1]}); } } } if (typeof OnSelectOver === "function"){ OnSelectOver(SelJsonStr);//呼叫回撥方法 } } }); }); }, function ( exp4 ) { alert("資料讀取出錯"); }); }catch(e3){ alert("資料讀取出錯"); } }); },SelectToValue:function(table,keyword,OnSelectOver){//表名,查詢關鍵字,回撥方法 mui.plusReady(function() { try{ plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function( fs ) { fs.root.getFile('DB/'+table+'.cdb',{create:true}, function(fileEntry){ fileEntry.file( function(file){//建立一個檔案讀寫物件,檔案沒有的時候建立一個新的 var fileReader = new plus.io.FileReader(); fileReader.readAsText(file, 'utf-8'); fileReader.onloadend = function(evt) { //alert(evt.target.result);//檔案內容 var DataCentent=evt.target.result; var SelJsonStr=[];//接收查詢到的結果的變數 if(DataCentent!=""){ var keysValues=DataCentent.split("\r\n"); for(var i=0;i<keysValues.length;i++){ if(keysValues[i]!=""){ var KV=keysValues[i].split(">"); if((KV[1]).indexOf(keyword)!=-1){ SelJsonStr.push({"key":KV[0],"value":KV[1]}); } } } } if (typeof OnSelectOver === "function"){ OnSelectOver(SelJsonStr);//呼叫回撥方法 } } }); }); }, function ( exp4 ) { alert("資料讀取出錯"); }); }catch(e3){ alert("資料讀取出錯"); } }); } } })();