当前位置: 首页 > 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…...

OpenMesh 最优选点策略

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 继续沿着之前的思路:OpenMesh 网格顶点Quadric误差计算,有时候,无论是网格简化或是网格平滑,总会涉及到添加一个新的顶点的问题,那么新顶点应该怎么生成呢?以网格的简化操作为例,假设我们要合并两个顶点,也…...

服务器内存总量和内存条有差异是什么问题 103.239.244.X

服务器内存总量和内存条上标注的容量可能会存在一些差异&#xff0c;这是由于以下几个原因&#xff1a; 部分内存被保留给系统和其他硬件设备&#xff1a;在服务器中&#xff0c;一部分内存可能被保留给系统和其他硬件设备&#xff0c;比如显卡、网卡、RAID卡等。这些设备需要一…...

WPF DataGrid详细列表手动显示与隐藏

设置显示序号与折叠显示样式 <DataTemplate x:Key"dtNum"><Button BorderBrush"Transparent" Style"{x:Null}" Click"BtnRowDetail_ShowHideClick" FontSize"16" Background"Transparent"><Stack…...

Compose 组件 - 分页器 HorizontalPager、VerticalPager

一、概念 类似于 ViewPager&#xff0c;1.4 版本之前需要借助 accompanis 库&#xff0c;底层基于 LazyColumn、LazyRow 实现&#xff0c;在使用上也基本相同。默认情况下 HorizontalPager 占据屏幕的整个宽度&#xff0c;VerticalPager 会占据整个高度。 fun HorizontalPager(…...

Web3 招聘 | Bitget、MyShell、imToken、Arweave 多项目招聘中

「Web3 招聘」是 TinTinLand 为 Web3 项目和求职者创建的一个招聘信息汇集专栏。本栏目将持续更新区块链行业招聘信息&#xff0c;满足不同求职者与项目方的多样需求。欢迎各项目方联系 TinTinLand 发布职位需求&#xff0c;欢迎求职者关注 TinTinLand 获取最新招聘信息。 此外…...

通过HTTP发送大量数据的三种方法

在网络的早期时期&#xff0c;人们发送的文件大小仅为几KB。到了2023年&#xff0c;我们享受着高分辨率的MB级别图像&#xff0c;并在几GB的4K&#xff08;即将是8K&#xff09;视频中观看。 即使有良好的互联网连接&#xff0c;下载一个5GB的文件仍然需要一些时间。如果你拥有…...

【MySQL】索引和事物

目录 ♫索引 ♪什么是索引 ♪索引的数据结构 ♪索引的使用 ♫事务 ♪什么是事务 ♪事务的特性 ♪事务的使用 ♫索引 ♪什么是索引 索引是存储在磁盘上的一个数据结构&#xff0c;通过索引可以快速地定位到存储在磁盘上的数据。 索引在提高查询速度的同时&#xff0c;还提…...

win11下的VS2022+QT6+VTK9.2+PCL1.13.1联合开发环境配置及踩坑记录

准备工作&#xff1a; 安装VS2022&#xff1a;这个比较简单&#xff0c;网上随便找个教程就行 安装QT并为VS2022添加QT Creater插件&#xff1a;VS2022配置Qt6_vs2022 qt6-CSDN博客 安装PCL&#xff1a;vs2022配置pcl1.13.1_pcl配置-CSDN博客 安装PCL过程中本身也会安装VTK&…...

CEdit

1、https://www.cnblogs.com/milanleon/p/5626174.html 2、CEdit控件提供访问函数主要有&#xff1a; int GetWindowText(LPCTSTR lpszStringBuf,intnMaxCount) 获取控件文本&#xff0c;与ReadText()功能相同 void SetWindowText(LPCTSTR lpszString) 设置控件文本 void …...

vue3 自定义指令

Vue 除了内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令。 一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。 在setup语法糖中&#xff0c;任何以 v 开头的驼峰式命名的变量…...