当前位置: 首页 > news >正文

RN操作SQLite数据库的包(sqlite-helper.js)及其使用

先安装

yarn add react-native-sqlite-storage

sqlite-helper.js工具包的具体代码

"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _reactNativeSqliteStorage=_interopRequireDefault(require("react-native-sqlite-storage"));_reactNativeSqliteStorage.default.DEBUG(__DEV__);_reactNativeSqliteStorage.default.enablePromise(true);function isEmptyObj(obj){return Object.prototype.toString.call(obj)==='[object Object]'&&Object.keys(obj).length===0;}function isObject(target){return Object.prototype.toString.call(target)==='[object Object]';}var SQLite=function(){function SQLite(){(0,_classCallCheck2.default)(this,SQLite);for(var _len=arguments.length,rest=new Array(_len),_key=0;_key<_len;_key++){rest[_key]=arguments[_key];}if(rest.length===1&&isObject(rest[0])){var databaseOptions=rest[0];this.databaseOptions=databaseOptions;}else{var databaseName=rest[0],databaseVersion=rest[1],databaseDisplayName=rest[2],_rest$=rest[3],databaseSize=_rest$===void 0?-1:_rest$;this.databaseName=databaseName;this.databaseVersion=databaseVersion;this.databaseDisplayName=databaseDisplayName;this.databaseSize=databaseSize;}this.successInfo=function(text,absolutely){if(__DEV__){if(absolutely===true){console.log(text);}else{console.log("[SQLiteHelper] info: database "+text+" success.");}}};this.warningInfo=function(text,absolutely){if(__DEV__){if(absolutely===true){console.warn(text);}else{console.warn("[SQLiteHelper] warn: "+text+".");}}};this.errorInfo=function(text,err,absolutely){if(__DEV__){if(absolutely===true){console.error(text);}else{console.error("[SQLiteHelper] err: database "+text+" error, "+err.message);}}};this.open=this._open.bind(this);this.close=this._close.bind(this);this.createTable=this._createTable.bind(this);this.dropTable=this._dropTable.bind(this);this.insertItems=this._insertItems.bind(this);this.deleteItem=this._deleteItem.bind(this);this.updateItem=this._updateItem.bind(this);this.selectItems=this._selectItems.bind(this);}(0,_createClass2.default)(SQLite,[{key:"_open",value:function _open(){var _this=this;var _await$SQLiteStorage$,failed,openDatabase;return _regenerator.default.async(function _open$(_context){while(1)switch(_context.prev=_context.next){case 0:_context.next=2;return _regenerator.default.awrap(_reactNativeSqliteStorage.default.echoTest().catch(function(err){return{failed:err};}));case 2:_await$SQLiteStorage$=_context.sent;failed=_await$SQLiteStorage$.failed;if(!failed){_context.next=6;break;}return _context.abrupt("return",{err:failed});case 6:if(this.databaseOptions){openDatabase=function openDatabase(){return _reactNativeSqliteStorage.default.openDatabase(_this.databaseOptions);};}else{openDatabase=function openDatabase(){return _reactNativeSqliteStorage.default.openDatabase(_this.databaseName,_this.databaseVersion,_this.databaseDisplayName,_this.databaseSize);};}return _context.abrupt("return",openDatabase().then(function(db){_this.successInfo('open');_this.db=db;return{res:db};}).catch(function(err){_this.errorInfo('open',err);return{err:err};}));case 8:case"end":return _context.stop();}},null,this,null,Promise);}},{key:"_close",value:function _close(){var _this2=this;return _regenerator.default.async(function _close$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:if(!this.db){_context2.next=2;break;}return _context2.abrupt("return",this.db.close().then(function(res){_this2.successInfo('close');_this2.db=null;return{res:res||'Database CLOSED'};}).catch(function(err){_this2.errorInfo('close',err);return{err:err};}));case 2:this.warningInfo('Database was not OPENED');return _context2.abrupt("return",{res:'Database was not OPENED'});case 4:case"end":return _context2.stop();}},null,this,null,Promise);}},{key:"_createTable",value:function _createTable(tableInfo){var _this3=this;var tableName,tableFields,_await$this$open,err,sqlStr;return _regenerator.default.async(function _createTable$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:_context3.prev=0;tableName=tableInfo.tableName,tableFields=tableInfo.tableFields;if(!(!tableName||!tableFields)){_context3.next=4;break;}throw new Error('Required parameter missing');case 4:if(this.db){_context3.next=11;break;}_context3.next=7;return _regenerator.default.awrap(this.open());case 7:_await$this$open=_context3.sent;err=_await$this$open.err;if(!err){_context3.next=11;break;}throw err;case 11:sqlStr=tableFields.reduce(function(sqlSegment,field,index,arr){return sqlSegment+" "+field.columnName+" "+field.dataType+" "+(index+1===arr.length?');':',');},"CREATE TABLE IF NOT EXISTS "+tableName+"(");_context3.next=14;return _regenerator.default.awrap(this.db.executeSql(sqlStr).then(function(res){_this3.successInfo('createTable');return{res:res};}).catch(function(err){_this3.errorInfo('createTable',err);return{err:err};}));case 14:return _context3.abrupt("return",_context3.sent);case 17:_context3.prev=17;_context3.t0=_context3["catch"](0);return _context3.abrupt("return",{err:_context3.t0});case 20:case"end":return _context3.stop();}},null,this,[[0,17]],Promise);}},{key:"_dropTable",value:function _dropTable(tableName){var _this4=this;var _await$this$open2,err;return _regenerator.default.async(function _dropTable$(_context4){while(1)switch(_context4.prev=_context4.next){case 0:_context4.prev=0;if(tableName){_context4.next=3;break;}throw new Error('Required parameter missing');case 3:if(this.db){_context4.next=10;break;}_context4.next=6;return _regenerator.default.awrap(this.open());case 6:_await$this$open2=_context4.sent;err=_await$this$open2.err;if(!err){_context4.next=10;break;}throw err;case 10:_context4.next=12;return _regenerator.default.awrap(this.db.executeSql("DROP TABLE "+tableName+";").then(function(res){_this4.successInfo('dropTable');return{res:res};}).catch(function(err){_this4.errorInfo('dropTable',err);return{err:err};}));case 12:return _context4.abrupt("return",_context4.sent);case 15:_context4.prev=15;_context4.t0=_context4["catch"](0);return _context4.abrupt("return",{err:_context4.t0});case 18:case"end":return _context4.stop();}},null,this,[[0,15]],Promise);}},{key:"_insertItems",value:function _insertItems(tableName,items){var _this5=this;var _await$this$open3,err,sqlStrArr;return _regenerator.default.async(function _insertItems$(_context5){while(1)switch(_context5.prev=_context5.next){case 0:_context5.prev=0;if(!(!tableName||!items)){_context5.next=3;break;}throw new Error('Required parameter missing');case 3:if(!(typeof tableName!=='string')){_context5.next=5;break;}throw new Error("Parameter tableName expects string but "+typeof tableName);case 5:if(Array.isArray(items)){_context5.next=7;break;}throw new Error("Parameter items expects array but "+typeof items);case 7:if(this.db){_context5.next=14;break;}_context5.next=10;return _regenerator.default.awrap(this.open());case 10:_await$this$open3=_context5.sent;err=_await$this$open3.err;if(!err){_context5.next=14;break;}throw err;case 14:sqlStrArr=items.map(function(item){var columns=Object.keys(item);var sqlStr=columns.reduce(function(sqlSegment,columnName,index,arr){return sqlSegment+" "+columnName+" "+(index+1===arr.length?')':',');},"INSERT INTO "+tableName+" (");sqlStr+=columns.reduce(function(sqlSegment,columnName,index,arr){return sqlSegment+" "+(typeof item[columnName]!=='number'?"'"+item[columnName]+"'":item[columnName])+" "+(index+1===arr.length?');':',');},' VALUES (');return sqlStr;});_context5.next=17;return _regenerator.default.awrap(this.db.sqlBatch(sqlStrArr).then(function(res){_this5.successInfo('insertItemsBatch');return{res:res||'All INSERT SQL done'};}).catch(function(err){_this5.errorInfo('insertItemsBatch',err);return{err:err};}));case 17:return _context5.abrupt("return",_context5.sent);case 20:_context5.prev=20;_context5.t0=_context5["catch"](0);return _context5.abrupt("return",{err:_context5.t0});case 23:case"end":return _context5.stop();}},null,this,[[0,20]],Promise);}},{key:"_deleteItem",value:function _deleteItem(tableName,conditions){var _this6=this;var _await$this$open4,err,sqlStr,_conditions$combine,combine,_conditions;return _regenerator.default.async(function _deleteItem$(_context6){while(1)switch(_context6.prev=_context6.next){case 0:_context6.prev=0;if(tableName){_context6.next=3;break;}throw new Error('Required parameter missing');case 3:if(this.db){_context6.next=10;break;}_context6.next=6;return _regenerator.default.awrap(this.open());case 6:_await$this$open4=_context6.sent;err=_await$this$open4.err;if(!err){_context6.next=10;break;}throw err;case 10:if(conditions){if(Array.isArray(conditions)&&conditions.length>0){sqlStr=conditions.reduce(function(sqlSegment,condition,index,arr){var columnName=condition.columnName,_condition$operator=condition.operator,operator=_condition$operator===void 0?'=':_condition$operator,value=condition.value;if(columnName&&value){var _value=typeof value!=='number'?"'"+value+"'":value;return sqlSegment+" "+columnName+operator+_value+" "+(index+1!==arr.length?'AND':';');}return'';},"DELETE FROM "+tableName+" WHERE");}else if(isObject(conditions)&&!isEmptyObj(conditions)){_conditions$combine=conditions.combine,combine=_conditions$combine===void 0?'OR':_conditions$combine,_conditions=conditions.conditions;sqlStr=_conditions.reduce(function(sqlSegment,condition,index,arr){var columnName=condition.columnName,_condition$operator2=condition.operator,operator=_condition$operator2===void 0?'=':_condition$operator2,value=condition.value;if(columnName&&value){var _value=typeof value!=='number'?"'"+value+"'":value;return sqlSegment+" "+columnName+operator+_value+" "+(index+1!==arr.length?combine:';');}return'';},"DELETE FROM "+tableName+" WHERE");}else if(typeof conditions==='string'){sqlStr="DELETE FROM "+tableName+" WHERE "+conditions+";";}}else{sqlStr="DELETE FROM "+tableName+";";}_context6.next=13;return _regenerator.default.awrap(this.db.executeSql(sqlStr).then(function(res){_this6.successInfo("SQLiteStorage deleteItem success: \u5F71\u54CD "+res[0].rowsAffected+" \u884C",true);return{res:res||'DELETE SQL done'};}).catch(function(err){_this6.errorInfo('deleteItem',err);return{err:err};}));case 13:return _context6.abrupt("return",_context6.sent);case 16:_context6.prev=16;_context6.t0=_context6["catch"](0);return _context6.abrupt("return",{err:_context6.t0});case 19:case"end":return _context6.stop();}},null,this,[[0,16]],Promise);}},{key:"_updateItem",value:function _updateItem(tableName,item,conditions){var _this7=this;var _await$this$open5,err,columns,sqlStr,_conditions$combine2,combine,_conditions;return _regenerator.default.async(function _updateItem$(_context7){while(1)switch(_context7.prev=_context7.next){case 0:_context7.prev=0;if(!(!tableName||!item)){_context7.next=3;break;}throw new Error('Required parameter missing');case 3:if(!(typeof tableName!=='string')){_context7.next=5;break;}throw new Error("Parameter tableName expects string but "+typeof tableName);case 5:if(isObject(item)){_context7.next=7;break;}throw new Error("Parameter item expects object but "+Object.prototype.toString.call(item));case 7:if(this.db){_context7.next=14;break;}_context7.next=10;return _regenerator.default.awrap(this.open());case 10:_await$this$open5=_context7.sent;err=_await$this$open5.err;if(!err){_context7.next=14;break;}throw err;case 14:columns=Object.keys(item);sqlStr=columns.reduce(function(sqlSegment,columnName,index,arr){return sqlSegment+" "+columnName+"="+(typeof item[columnName]!=='number'?"'"+item[columnName]+"'":item[columnName])+" "+(index+1!==arr.length?',':'');},"UPDATE "+tableName+" SET");if(conditions){if(Array.isArray(conditions)&&conditions.length>0){sqlStr+=conditions.reduce(function(sqlSegment,condition,index,arr){var columnName=condition.columnName,_condition$operator3=condition.operator,operator=_condition$operator3===void 0?'=':_condition$operator3,value=condition.value;if(columnName&&value){var _value=typeof value!=='number'?"'"+value+"'":value;return sqlSegment+" "+columnName+operator+_value+" "+(index+1!==arr.length?'AND':';');}return'';},'WHERE');}else if(isObject(conditions)&&!isEmptyObj(conditions)){_conditions$combine2=conditions.combine,combine=_conditions$combine2===void 0?'OR':_conditions$combine2,_conditions=conditions.conditions;sqlStr+=_conditions.reduce(function(sqlSegment,condition,index,arr){var columnName=condition.columnName,_condition$operator4=condition.operator,operator=_condition$operator4===void 0?'=':_condition$operator4,value=condition.value;if(columnName&&value){var _value=typeof value!=='number'?"'"+value+"'":value;return sqlSegment+" "+columnName+operator+_value+" "+(index+1!==arr.length?combine:';');}return'';},'WHERE');}else if(typeof conditions==='string'){sqlStr+="WHERE "+conditions+";";}}else sqlStr+=';';_context7.next=19;return _regenerator.default.awrap(this.db.executeSql(sqlStr).then(function(res){_this7.successInfo("SQLiteStorage updateItem success: \u5F71\u54CD "+res[0].rowsAffected+" \u884C",true);return{res:res||'UPDATE SQL done'};}).catch(function(err){_this7.errorInfo('updateItem',err);return{err:err};}));case 19:return _context7.abrupt("return",_context7.sent);case 22:_context7.prev=22;_context7.t0=_context7["catch"](0);return _context7.abrupt("return",{err:_context7.t0});case 25:case"end":return _context7.stop();}},null,this,[[0,22]],Promise);}},{key:"_selectItems",value:function _selectItems(tableName){var _this8=this;var config,_config$columns,columns,conditions,pageNo,pageLength,_await$this$open6,err,sqlStr,_conditions$combine3,combine,_conditions,_conditions$combine4,_combine,_conditions2,limit,offset,_args8=arguments;return _regenerator.default.async(function _selectItems$(_context8){while(1)switch(_context8.prev=_context8.next){case 0:config=_args8.length>1&&_args8[1]!==undefined?_args8[1]:{};_context8.prev=1;_config$columns=config.columns,columns=_config$columns===void 0?'*':_config$columns,conditions=config.conditions,pageNo=config.pageNo,pageLength=config.pageLength;if(tableName){_context8.next=5;break;}throw new Error('Required parameter missing');case 5:if(this.db){_context8.next=12;break;}_context8.next=8;return _regenerator.default.awrap(this.open());case 8:_await$this$open6=_context8.sent;err=_await$this$open6.err;if(!err){_context8.next=12;break;}throw err;case 12:if(columns==='*'){if(conditions){if(Array.isArray(conditions)&&conditions.length>0){sqlStr=conditions.reduce(function(sqlSegment,condition,index,arr){var columnName=condition.columnName,_condition$operator5=condition.operator,operator=_condition$operator5===void 0?'=':_condition$operator5,value=condition.value;if(columnName&&value){var _value=typeof value!=='number'?"'"+value+"'":value;return sqlSegment+" "+columnName+operator+_value+" "+(index+1!==arr.length?'AND':'');}return'';},"SELECT * FROM "+tableName+" WHERE");}else if(isObject(conditions)&&!isEmptyObj(conditions)){_conditions$combine3=conditions.combine,combine=_conditions$combine3===void 0?'OR':_conditions$combine3,_conditions=conditions.conditions;sqlStr=_conditions.reduce(function(sqlSegment,condition,index,arr){var columnName=condition.columnName,_condition$operator6=condition.operator,operator=_condition$operator6===void 0?'=':_condition$operator6,value=condition.value;if(columnName&&value){var _value=typeof value!=='number'?"'"+value+"'":value;return sqlSegment+" "+columnName+operator+_value+" "+(index+1!==arr.length?combine:'');}return'';},"SELECT * FROM "+tableName+" WHERE");}else if(typeof conditions==='string'){sqlStr="SELECT * FROM "+tableName+" WHERE "+conditions+";";}}else{sqlStr="SELECT * FROM "+tableName;}}else{sqlStr=columns.reduce(function(sqlSegment,column,index,arr){return sqlSegment+" "+column+" "+(index+1!==arr.length?',':'');},'SELECT');if(conditions){if(Array.isArray(conditions)&&conditions.length>0){sqlStr+=conditions.reduce(function(sqlSegment,condition,index,arr){var columnName=condition.columnName,_condition$operator7=condition.operator,operator=_condition$operator7===void 0?'=':_condition$operator7,value=condition.value;if(columnName&&value){var _value=typeof value!=='number'?"'"+value+"'":value;return sqlSegment+" "+columnName+operator+_value+" "+(index+1!==arr.length?'AND':'');}return'';},"FROM "+tableName+" WHERE");}else if(isObject(conditions)&&!isEmptyObj(conditions)){_conditions$combine4=conditions.combine,_combine=_conditions$combine4===void 0?'OR':_conditions$combine4,_conditions2=conditions.conditions;sqlStr+=_conditions2.reduce(function(sqlSegment,condition,index,arr){var columnName=condition.columnName,_condition$operator8=condition.operator,operator=_condition$operator8===void 0?'=':_condition$operator8,value=condition.value;if(columnName&&value){var _value=typeof value!=='number'?"'"+value+"'":value;return sqlSegment+" "+columnName+operator+_value+" "+(index+1!==arr.length?_combine:'');}return'';},"FROM "+tableName+" WHERE");}else if(typeof conditions==='string'){sqlStr+="FROM "+tableName+" WHERE "+conditions;}}else{sqlStr+="FROM "+tableName;}}if(pageNo&&pageLength){limit=pageNo*pageLength;offset=pageLength*(pageNo-1)>0?pageLength*(pageNo-1):0;sqlStr+=" limit "+limit+" offset "+offset+";";}else{sqlStr+=';';}_context8.next=16;return _regenerator.default.awrap(this.db.executeSql(sqlStr).then(function(res){if(res&&res[0]&&res[0].rows){_this8.successInfo("SQLiteStorage selectItems success: \u67E5\u8BE2\u5230 "+res[0].rows.length+" \u884C",true);var queryResult=[];var len=res[0].rows.length;for(var i=0;i<len;i++){queryResult.push(res[0].rows.item(i));}return{res:queryResult};}return{res:res};}).catch(function(err){_this8.errorInfo('selectItems',err);return{err:err};}));case 16:return _context8.abrupt("return",_context8.sent);case 19:_context8.prev=19;_context8.t0=_context8["catch"](1);return _context8.abrupt("return",{err:_context8.t0});case 22:case"end":return _context8.stop();}},null,this,[[1,19]],Promise);}}],[{key:"delete",value:function _delete(databaseName){return _regenerator.default.async(function _delete$(_context9){while(1)switch(_context9.prev=_context9.next){case 0:return _context9.abrupt("return",_reactNativeSqliteStorage.default.deleteDatabase(databaseName).then(function(res){return{res:res||"Database "+databaseName+" DELETED"};}).catch(function(err){return{err:err};}));case 1:case"end":return _context9.stop();}},null,null,null,Promise);}}]);return SQLite;}();exports.default=SQLite;

接下来是我使用这个工具包封装的一些方法,存在(SQLHelper.js)文件中

这里的 name 属性指定了数据库的名称,createFromLocation 属性指定了从特定位置创建数据库,而 readOnly 属性指定了数据库是否为只读模式。
name 属性:你在这里提供的是数据库的名称 ‘taketeam_db’。这将是你创建或连接的数据库的名称。
createFromLocation 属性:这个属性设置为 1,表示数据库将从特定的位置创建。这通常意味着数据库已经在设备的特定位置存在,你只需连接到它而不是创建一个新的数据库。这个属性通常在移动应用程序中用于将预加载的数据库复制到设备上,以便应用程序可以使用。
readOnly 属性:这个属性设置为 false,表示数据库是可读写的。如果你将其设置为 true,则数据库将只能以只读模式打开,不能执行写操作。

createFromLocation 属性是用于从特定位置创建数据库的选项,通常在移动应用中使用。它的工作方式是根据应用程序的平台和配置来决定数据库的位置。具体来说:
Android 平台:在 Android 上,这个属性通常用于从应用的资产文件夹中复制数据库文件到设备上。你可以将数据库文件放在 android/app/src/main/assets 目录中,然后设置 createFromLocation 属性为 1,这将告诉应用从资产文件夹中复制数据库文件到设备上。
iOS 平台:在 iOS 上,这个属性通常用于从应用的资源束中复制数据库文件。你可以将数据库文件放在应用的资源束中,并设置 createFromLocation 属性为 1,应用会尝试从资源束中复制数据库文件到设备上。
其他平台:在其他平台上,具体的工作方式可能会有所不同,通常需要根据平台的特定要求进行配置。
总之,createFromLocation 属性是用于告诉应用从特定位置复制数据库文件到设备上的选项,具体的位置和工作方式取决于应用的平台和配置。你需要根据你的应用和数据库文件的存放位置来正确配置这个选项。如果你的数据库文件已经位于应用的资源或资产文件夹中,设置 createFromLocation 为 1 应该能够让应用正确地复制数据库文件到设备上。

我的数据库存放地址为:

E:\Taketeam_Frontend\android\app\src\main\assets\www\taketeam_db
import { async } from '@babel/runtime/helpers/regeneratorRuntime'
import SQLiteHelper from '../db/sqlite-helper'// SQLiteHelper 执行实例方法之前不用手动打开open(自动检测并打开),而直接使用SQLite实例执行sql,需要手动打开
const dbTool = new SQLiteHelper({name: 'taketeam_db',createFromLocation: 1,readOnly: false,
})async function openDB (callBack) {// 开启数据库const { res, err } = await dbTool.open()if (res) {callBack(true)} else {console.log('数据库打开失败', err)}
}/*** tableName 表名* condition 条件* callBack 回调函数*/
async function search (tableName, condition, callBack) {let config = { columns: '*' }if (condition !== null) {config = {columns: '*',conditions: [condition],}}const { res, err } = await dbTool.selectItems(tableName, config)if (res) {callBack(res)} else {console.log('err', err)}
}/*** tableName 表名* condition 条件* callBack 回调函数*/
async function searchSingle (tableName, config, callBack) {const { res, err } = await dbTool.selectItems(tableName, config)if (res) {callBack(res)} else {console.log('err', err)}
}/** 删除单项* tableName 表名* item_id 项目id* callBack 回调函数*/
async function remove (tableName, item_id, columnName, callBack) {const condition = { columnName: columnName, value: item_id }const { res, err } = await dbTool.deleteItem(tableName, [condition])if (res) {callBack(res)} else {console.log('err', err)}
}/** 批量删除* tableName 表名* item_ids 项目id* callBack 回调函数*/
async function multilRemove (tableName, item_ids, callBack) {let conditionArr = []item_ids.forEach(item => {const content = { columnName: 'id', value: item }conditionArr.push(content)})const command = { combine: 'OR', conditions: conditionArr }const { res, err } = await dbTool.deleteItem(tableName, command)if (res) {callBack(res)} else {console.log('err', err)}
}/** 新增数据* tableName 表名* objects 对象数组* callBack 回调函数*/
async function insert (tableName, objects, callBack) {const { res, err } = await dbTool.insertItems(tableName, objects)if (res) {callBack(res)} else {console.log('err', err)}
}/** 修改数据* tableName 表名* item_id 项目id* objects 对象数组* callBack 回调函数*/
async function modify (tableName, columnName, objects, item_ids, callBack) {let conditions = []item_ids.forEach(item_id => {const condition = { columnName: columnName, value: item_id }conditions.push(condition)})const command = { combine: 'OR', conditions: conditions }const { res, err } = await dbTool.updateItem(tableName, objects, command)if (res) {callBack(res)} else {console.log('err', err)}
}// 删除表数据(不删除结构)
function clear (tableName) {// 清空表数据dbTool.deleteItem(tableName, null) // 第二个参数传入null表示删除条件为空.then(result => {if (result.err) {console.error('清空表' + tableName + '数据失败', result.err)} else {console.log('表数据已成功清空')}})
}
/*** 清空表数据*/
async function clearTable () {// grade  班组表名// train  训练记录表名// sensor 设备表名// user  学员表名clear('user')clear('grade')clear('train')clear('sensor')}
export default {openDB,search,searchSingle,remove,multilRemove,insert,clearTable,modify,
}

可以根据项目需要在进行一次封装

import SQLHelper from './SQLHelper'
import Marco from '../utils/Marco'// 获取班级列表
export function getGradeList (callBack) {SQLHelper.search(Marco.GradeTb, null, res => {callBack(res)})
}// 获取学生列表
export function getStuList (grade_id, callBack) {const condition = { columnName: 'grade_id', value: grade_id }SQLHelper.search(Marco.UserTb, condition, res => {callBack(res)})
}// 创建一个班级
export function createClass (info, callBack) {SQLHelper.insert(Marco.GradeTb, [info], () => {callBack()})
}// 创建一个学员
export function createUser (info, callBack) {SQLHelper.insert(Marco.UserTb, [info], () => {callBack()})
}// 更新成员信息
export function updateUser (info, user_id, callBack) {SQLHelper.modify(Marco.UserTb, 'id', info, [user_id], () => {callBack()})
}// 更新班级学员数量
export function updateCounts (info, grade_id, callBack) {SQLHelper.modify(Marco.GradeTb, 'id', info, [grade_id], () => {callBack()})
}// 删除学员
export function delMember (item_ids, callBack) {SQLHelper.multilRemove(Marco.UserTb, item_ids, () => {callBack()})
}// 获取设备列表
export function getSensorList (callBack) {SQLHelper.search(Marco.SensorTb, null, res => {callBack(res)})
}// 更新臂带绑定关系
export function updateUserSensor (info, user_id, callBack) {SQLHelper.modify(Marco.UserTb, 'id', info, [user_id], () => {callBack()})
}// 查询新建班级的id
export function getClassId (info, callBack) {const config = { columns: ['id'], conditions: [info] }SQLHelper.searchSingle(Marco.GradeTb, config, res => {callBack(res)})
}// 查询班级训练记录
export function getRecord (grade_id, callBack) {const condition = { columnName: 'grade_id', value: grade_id }SQLHelper.search(Marco.TrainTb, condition, res => {callBack(res)})
}// 存储首次上课记录
export function saveSession (info, callBack) {SQLHelper.insert(Marco.TrainTb, [info], res => {callBack(res)})
}export function updateLastSession (info, grade_id, callBack) {SQLHelper.modify(Marco.GradeTb, 'id', info, [grade_id], () => {callBack()})
}// 查询新建班级的id
export function getSessionId (info, callBack) {const config = { columns: ['id'], conditions: [info] }SQLHelper.searchSingle(Marco.TrainTb, config, res => {callBack(res)})
}// 每分钟存一次上课记录
export function updateSession (info, session_id, callBack) {SQLHelper.modify(Marco.TrainTb, 'id', info, [session_id], () => {callBack()})
}//修改班级名称
export function updateClassName (info, grade_id, callBack) {SQLHelper.modify(Marco.GradeTb, 'id', info, [grade_id], () => {callBack()})
}// 删除班级
export function delGrade (item_ids, callBack) {SQLHelper.multilRemove(Marco.GradeTb, item_ids, () => {callBack()})
}// 删除班级对应的学员
export function delGradeUsers (item_ids, callBack) {SQLHelper.remove(Marco.UserTb, item_ids, 'grade_id', () => {callBack()})
}// 删除成员正在绑定的心率设备
export function delUserbindSensor (info, sn, callBack) {SQLHelper.modify(Marco.UserTb, 'sn', info, [sn], () => {callBack()})
}// 批量添加成员
export function addMembers (info, callBack) {SQLHelper.insert(Marco.UserTb, info, () => {callBack()})
}// 根据臂带号查询用户信息
export function searchUserSensorNo (item_id, callBack) {const condition = { columnName: 'sn', value: item_id }SQLHelper.search(Marco.UserTb, condition, res => {callBack(res)})
}// 批量更新用户信息
export function updateUserSensorInfo (item_ids, info, callBack) {SQLHelper.modify(Marco.UserTb, 'id', info, item_ids, res => {callBack(res)})
}// 删除没有数据的训练记录
export function delNodataRecord (item_ids, callBack) {SQLHelper.remove(Marco.TrainTb, item_ids, 'id', () => {callBack()})
}export function delTrainRecord (item_ids, callBack) {SQLHelper.remove(Marco.TrainTb, item_ids, 'grade_id', () => {callBack()})
}

相关文章:

RN操作SQLite数据库的包(sqlite-helper.js)及其使用

先安装 yarn add react-native-sqlite-storagesqlite-helper.js工具包的具体代码 "use strict";var _interopRequireDefaultrequire("babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true…...

软件测试学习(四)自动测试和测试工具、缺陷轰炸、外包测试、计划测试工作、编写和跟踪测试用例

目录 自动测试和测试工具 工具和自动化的好处 测试工具 查看器和监视器 驱动程序 桩 压力和负载工具 干扰注入器和噪声发生器 分析工具 软件测试自动化 宏录制和回放 可编程的宏 完全可编程的自动测试工具 随机测试&#xff1a;猴子和大猩猩 使用测试工具和自动…...

【Rust日报】2023-10-12 论文:利用公共信息评估 Rust 代码库

论文 - 利用公共信息评估 Rust 代码库 作者 Emil Eriksson 是 Lund University 的硕士学生&#xff0c;今年春天发布了其硕士论文 Evaluation of Rust Codebases Using Public Information &#xff0c;并获得了 electrical engineering 学位。 在论文撰写过程中&#xff0c;Em…...

微信小程序入门

微信小程序介绍 微信小程序是一种轻量级应用程序&#xff0c;可以在微信中直接使用&#xff0c;无需下载和安装。它们基于微信的开发标准和API构建&#xff0c;并且可以实现许多不同的功能&#xff0c;例如娱乐、社交、购物、生活服务等。微信小程序用户仅需点击微信聊天窗口中…...

【RocketMQ系列二】通过docker部署单机RocketMQ

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…...

中缀表达式转后缀表达式

58同城1012笔试第二题 示例1 输入 “exp1 & (exp2|exp3)/!exp4” 输出 “exp1 exp2 exp3| & exp4 !” 思路与代码 这个代码的核心思想是通过栈来处理不同操作符的优先级和括号的嵌套&#xff0c;将中缀表达式转换为后缀表达式&#xff0c;以便更容易进行计算。 …...

Zabbix 使用同一ODBC监控不同版本MySQL

一、ODBC介绍 ODBC是Open Database Connect 即开发数据库互连的简称&#xff0c;它是一个用于访问数据库的统一界面标准。ODBC引入一个公共接口以解决不同数据库潜在的不一致性&#xff0c;从而很好的保证了基于数据库系统的应用程序的相对独立性。ODBC 概念由 Microsoft 开发&…...

Swagger3.0 与spring boot2.7x 整合避免swagger2.0与boot2.7冲突

注释掉2.0引入的俩包 直接引入3.0 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency> swagger配置文件粘贴即用哦 import org.springfram…...

【HTML+REACT+ANTD 表格操作】处理(改变)数据,改变DOM

博主&#xff1a;_LJaXi 专栏&#xff1a; React | 前端框架 主要是一些表格DOM操作&#xff0c;数据更换 个人向 HTML <!DOCTYPE html> <html lang"en"> <link> <meta charset"UTF-8" /> <meta name"viewport" con…...

【面试经典150 | 哈希表】最长连续序列

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;哈希表 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内…...

如何构建安全的App网络通信?

前言 说到安全肯定逃不开数据的加解密&#xff0c;数据本地存储大多用对称加解密来实现&#xff0c;那网络传输数据的时候是不是也用对称加解密来实现&#xff1f;没错&#xff0c;常规网络通信时&#xff0c;大部分网络传输过程中基本也是用对称加解密来实现的&#xff0c;毕竟…...

Chrome插件精选 — 网页截图插件

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件记录下比较好用的一款或几款&#xff0c;便于节省尝试的时间和精力。 捕捉网页截图 - FireShot 下载地址 (访问密码: 8276) Fireshot是一款浏览器插件&#xff0c…...

react+antd封装表格组件2.0

reactantd封装表格组件2.0 1.0版本 仅仅封装组件&#xff0c;不涉及方法需要掌握知识点useImperativeHandle 组件代码引用 1.0版本 仅仅封装组件&#xff0c;不涉及方法 1.0 仅封装组件 此方法把所用方法集体封装&#xff0c;以后就可以无脑开发拉&#xff01; 只需传入路径&…...

互联网Java工程师面试题·Java 并发编程篇·第八弹

目录 33、Java 死锁以及如何避免&#xff1f; 34、死锁的原因 35、怎么唤醒一个阻塞的线程 36、不可变对象对多线程有什么帮助 37、什么是多线程的上下文切换 38、如果你提交任务时&#xff0c;线程池队列已满&#xff0c;这时会发生什么这里区分一下&#xff1a; 39、J…...

21面向对象描述器

目录 1、什么是描述器&#xff1f; 1、原始的代码可以理解成为这样&#xff1a; 2、增加解释器可以改成如下&#xff0c;解释器就是集增删改查为一体的一个小的property 有一点需要注意的地方是&#xff1a;property里面内置的参数不是get_age()就是不用调用。 3、装饰器可…...

高校教务系统登录页面JS分析——皖西学院

高校教务系统密码加密逻辑及JS逆向 本文将介绍皖西学院教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密…...

单片机综合小项目

一、单片机做项目常识 1.行业常识 2.方案选型 3.此项目定位和思路 二、单片机的小项目介绍 1.项目名称&#xff1a;基于51单片机的温度报警器 &#xff08;1&#xff09;主控&#xff1a;stc51&#xff1b; &#xff08;2&#xff09;编程语言&#xff1a;C语言 &#xff08;…...

docker下的onlyoffice安装(for seafile)

docker镜像拉取 # 拉取 onlyoffice 镜像docker pull onlyoffice/documentserver 创建所需目录 # 创建几个目录 用于 onlyoffice 的数据卷cd /opt# 建议与 seafile 容器都放在 /opt 目录方便管理mkdir seafile-onlyofficecd seafile-onlyofficemkdir logmkdir datamkdir libmkd…...

1 两数之和

解题思路&#xff1a; \qquad 对每个数nums[i]&#xff0c;仅需在数组中搜索target-nums[i]是否存在。 优化思路&#xff1a; \qquad 首先能想到&#xff0c;利用哈希表O(1)查询target-nums[i]。 \qquad 建立map<int, vector<int>>的表能够处理重复元素&#x…...

NewStarCTF2023week2-Unserialize?

代码审计&#xff1a; 定义了一个eval类&#xff0c;该类下有一个私有变量cmd和公有成员函数destruct()&#xff0c;该函数在对象的所有引用都被删除或类被销毁时会自动调用&#xff1b; 调用该函数则会执行一个正则表达式进行正则匹配&#xff0c;过滤掉了一些常用命令和bas…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...