WEBAPP开发MUI框架下一个简单的JS模仿redis的数据存储插件

开发环境:HBuder工具 + mui框架

框架官网:http://www.dcloud.io/
框架API:http://www.html5plus.org/doc/h5p.html

公司开发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");
											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");
												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");
											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','').replace('<','').replace('\\','');
										values[k]=values[k].replace('>','').replace('<','').replace('\\','');
										
										var numInd=0;//重复次数
										for(var i=0;i");
												
												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"+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','').replace('<','').replace('\\','');
										for(var i=0;i");
												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");
												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");
												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("数据读取出错");
				}
			});
		}
	}
})();

你可能感兴趣的:(javascript,mui,hbuder,APP,webapp,redis,js,数据存储,javascript,mui,webapp,hbuder,数据存储)