1. 程式人生 > >WEBAPP開發MUI框架下一個簡單的JS模仿redis的資料儲存外掛

WEBAPP開發MUI框架下一個簡單的JS模仿redis的資料儲存外掛

開發環境: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("資料讀取出錯");
				}
			});
		}
	}
})();