开发环境: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("数据读取出错");
}
});
}
}
})();