在uni-app中使用SQLite

news2024/11/13 12:18:45

目录

1、引入sqlite模块

2、sqlite文件结构

3、初始化文件index.js

4、打开数据库

5、查询数据

6、可视化测试


 

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。

就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

1、引入sqlite模块

参考上一篇文章具体操作使用uni-app构建android项目-CSDN博客

后续的操作成功后,会在手机磁盘的根路径下生成transfer【数据库实例名】文件夹

里面包含transfer.db、transfer.db-shm、transfer.db-wal

其中transfer.db 可以通过navicat等工具打开

2、sqlite文件结构

在项目根路径下定义db\sqlite文件夹

除了index.js属于初始化sqlite库文件,其余文件均表示对数据库相关表的操作

f310ab9311464892ab575833ea1578ac.png

以boxDetail.js文件为例

在SysBoxDetail  函数内 init 方法,需要检查数据库表是否建立。

以及在已安装的应用程序后,对应的新增字段、索引、表数据修改等升级操作

提供对于表数据查询操作的相关函数

import {sqlite} from '@/db/sqlite/index.js'
import {strUtil, dateUtils} from '@/common/util.js'

const tabName = "sys_box_detail";

/**
 * boxNo=箱号,storeroom=库房号,totalNum=已清点数量,
 * status=是否封箱 0=否1=是,isDel=是否删除0=否,1=是
 */
const fields = "id  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,batchId INTEGER  not null, " 
	+" boxId INTEGER,  boxNo INTEGER not null, archNo text not null, createTime text,"
	+" fileNum text not null, storeroom text"
	
// 类似于构造函数,必须定义
function BoxDetail(){
	
}


BoxDetail.prototype = {
  constructor: BoxDetail,
} 

export const SysBoxDetail = {
	init: function(){
		if(!sqlite.isOpen()){
			sqlite.openDb();
		}
		return sqlite.isTable(tabName).then((res) => {
			console.log(tabName+"是否存在:" + res)
			if(!res) {
				sqlite.createTab(tabName, fields)
			}  else {
				// 用于后续升级版本  新增 fileNum字段
				sqlite.existsField(tabName, 'fileNum').then(res => {
					if(res[0].num == 0){
						let sql = "ALTER TABLE "+tabName+" ADD COLUMN fileNum text DEFAULT 1"
						sqlite.updateBySQL(sql).then(res => {
							console.log(res)
							console.log("插入字段成功")
						})
					} 
				})
				
				// 新增 createTime字段
				sqlite.existsField(tabName, 'createTime').then(res => {
					if(res[0].num == 0){
						let sql = "ALTER TABLE "+tabName+" ADD COLUMN createTime text"
						sqlite.updateBySQL(sql).then(res => {
							console.log(res)
							console.log("插入字段成功")
						})
					} 
				})
			}
			// 新增索引
			sqlite.existsIndex(tabName, tabName + '_idx_archNo').then( (res) => {
				console.log('索引判断:',res)
				if(res[0].num == 0){
					sqlite.createIndex(tabName, tabName + '_idx_archNo', 'archNo')
					sqlite.createIndex(tabName, tabName + '_idx_boxId', 'boxId')
					sqlite.createIndex(tabName, tabName + '_idx_batchId', 'batchId')
					sqlite.createIndex(tabName, tabName + '_idx_boxNo', 'boxNo')
				}
			})
			// 移除不存在的批次数据 ,后期再有新版本可以删除该行
			this.deleteByNotExistsBatchId();
			
		})
		
	},
	insert: function(data){
		return sqlite.addTabItem(tabName, data);
	},
	count: function(queryParam){
		let sql = "select count(*) as num from " + tabName + this.where(queryParam);
		return sqlite.selectBySQL(sql);
	},
	selectAll: function(queryParam){
		let sql = "select * from " + tabName + this.where(queryParam);
		let order = " order by archNo asc ";
		return sqlite.selectBySQL(sql + order);
	},
	selectById: function(id){
		let sql = `select * from ${tabName} where id = ${id}`;
		return sqlite.selectBySQL(sql);
	},
	updateFileNumById: function(id, fileNum) {
		let sql = `update ${tabName} set fileNum = ${fileNum} where id = ${id}`;
		return sqlite.updateBySQL(sql);
	},
	deleteById: function(id){
		return sqlite.deleteInformationType(tabName, {'id': id});
	},
	deleteByBoxId: function(boxId) {
		return sqlite.deleteInformationType(tabName, {'boxId': boxId});
	},
	deleteByBatchId: function(batchId) {
		return sqlite.deleteInformationType(tabName, {'batchId': batchId});
	},
	/**
	 * 移除无效的批次数据
	 */
	deleteByNotExistsBatchId: function(){
		let sql = `delete from ${tabName} where batchId not in (select id from sys_batch )`;
		return sqlite.updateBySQL(sql);
	},
	select: function(queryParam){
		let sql = "select * from " + tabName + this.where(queryParam);
		let order = " order by boxNo, archNo asc ";
		let limit = this.limit(queryParam)
		return sqlite.selectBySQL(sql + order + limit);
	},
	/**
	 * 关联boxId 查询,显示是否封箱
	 * @param {Object} queryParam
	 */
	selectWithBox: function(queryParam){
		let sql = "select a.*,b.status from " + tabName + " as a left outer join sys_box as b on a.boxId = b.id " 
		let where = this.where(queryParam, 'a');
		let order = " order by a.boxNo, a.archNo asc ";
		let limit = this.limit(queryParam)
		
		return sqlite.selectBySQL(sql + where + order + limit);
	},
	countByBatchNo: function(batchNo){
		let sql = "select count(*) as num from " + tabName + this.where({batchNo: batchNo});
		return sqlite.selectBySQL(sql);
	},
	countByArchNoAndBatchId: function(archNo, batchId){
		let sql = "select count(*) as num from " + tabName + 
			this.where({archNo: archNo, batchId: batchId});
		return sqlite.selectBySQL(sql);
	},
	where: function(queryParam, alias){
		let where = ''
		if(strUtil.isEmpty(alias)){
			alias = ''
		} else {
			alias +='.'
		}
		if(queryParam){
			var batchId = queryParam.batchId;
			if(strUtil.isNotEmpty(batchId)){
				where += ` and ${alias}batchId = ${batchId} `;
			}
			var boxId = queryParam.boxId;
			if(strUtil.isNotEmpty(boxId)){
				where += ` and ${alias}boxId = ${boxId}`;
			}
			var archNo = queryParam.archNo;
			if(strUtil.isNotEmpty(archNo)){
				where += ` and ${alias}archNo = "${archNo}" `
			}
			var searchValue = queryParam.searchValue;
			if(strUtil.isNotEmpty(searchValue)){
				where += ` and ( ${alias}boxNo = "${searchValue}" or ${alias}storeroom = "${searchValue}" or ${alias}archNo like "%${searchValue}%" )`
			}
			
		}
		if(where.length > 0){
			where = " where 1=1 " + where;
		}
		return where;
	},
	limit: function(queryParam){
		let num = queryParam.pageNum;
		let size = queryParam.pageSize
		let numindex = 0
		if(num <= 1){
			numindex = 0
		} else {
			numindex = ((num - 1) * size)
		}
		return ` limit ${numindex},${size}`
	}
	
}

 

3、初始化文件index.js

// 定义数据库实例名称
let dbName = "transfer"

export const openDb = () => {
	//如果数据库存在则打开,不存在则创建。
	return new Promise((resolve, reject) => {
		plus.sqlite.openDatabase({
			name: dbName, //数据库名称
			// path: `_doc/${dbName}.db`, //数据库地址
			path: `/storage/emulated/0/transfer/${dbName}.db`,
			success(e) {
				console.log(e)
				resolve(e);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	})
}
// 查询所有数据表名
export const getTable = () => {
	return new Promise((resolve, reject) => {
		plus.sqlite.selectSql({
			name: dbName,
			sql: "select * FROM sqlite_master where type='table'",
			success(e) {
				resolve(e);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	})
}
// 查询表数据总条数
export const getCount = (tabName) => {
	return new Promise((resolve, reject) => {
		plus.sqlite.selectSql({
			name: dbName,
			sql: "select count(*) as num from " + tabName,
			success(e) {
				resolve(e);
			},
			fail(e) {
				reject(e);
			}
		})
	})
}

// 查询表是否存在
export const isTable = (tabName) => {
	return new Promise((resolve, reject) => {
		plus.sqlite.selectSql({
			name: dbName,
			sql: `select count(*) as isTable FROM sqlite_master where type='table' and name='${tabName}'`,
			success(e) {
				resolve(e[0].isTable ? true : false);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	})
}
 

// 修改数据
export const updateBySQL = (sql) => {
	console.log(sql)
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql: sql,
			success(e) {
				console.log(e)
				resolve(e);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	})
	 
}


// 修改数据
export const updateSQL = (tabName, setData, setName, setVal) => {
	if (JSON.stringify(setData) !== '{}') {
		let dataKeys = Object.keys(setData)
		let setStr = ''
		dataKeys.forEach((item, index) => {
			console.log(setData[item])
			setStr += (
				`${item} = ${JSON.stringify(setData[item])}${dataKeys.length - 1 !== index ? "," : ""}`)
		})
		console.log(setStr)
		return new Promise((resolve, reject) => {
			plus.sqlite.executeSql({
				name: dbName,
				sql: `update ${tabName} set ${setStr} where ${setName} = "${setVal}"`,
				success(e) {
					console.log(e)
					resolve(e);
				},
				fail(e) {
					console.log(e)
					reject(e);
				}
			})
		})
	} else {
		return new Promise((resolve, reject) => {
			reject("错误")
		});
	}
}

//删除数据库数据
export const deleteInformationType = (tabName,setData) => {
	if (JSON.stringify(setData) !== '{}') {
		let dataKeys = Object.keys(setData)
		let setStr = ''
		dataKeys.forEach((item, index) => {
			console.log(setData[item])
			setStr += (
				`${item}=${JSON.stringify(setData[item])}${dataKeys.length - 1 !== index ? " and " : ""}`)
		})
		let sql = `delete from ${tabName} where ${setStr}`
		console.log(sql)
		return new Promise((resolve, reject) => {
			plus.sqlite.executeSql({
				name: dbName,
				sql: sql,
				success(e) {
					resolve(e);
				},
				fail(e) {
					reject(e);
				}
			})
		})
	} else {
		return new Promise((resolve, reject) => {
			reject("错误")
		});
	}
}

//关闭数据库
export const closeSQL = () => {
	return new Promise((resolve, reject) => {
		plus.sqlite.closeDatabase({
			name: dbName,
			success(e) {
				resolve(e);
			},
			fail(e) {
				reject(e);
			}
		})
	})
}

//监听数据库是否开启
export const isOpen = () => {
	let open = plus.sqlite.isOpenDatabase({
		name: dbName,
		path: `_doc/${dbName}.db`, 
	})
	return open;
}
// 创建表
export const createTab = (tabName, data) => {
	// tabName不能用数字作为表格名的开头
	return new Promise((resolve, reject) => {
		console.log("创建数据库表",tabName)
		plus.sqlite.executeSql({
			name: dbName,
			// sql: 'create table if not exists dataList("list" INTEGER PRIMARY KEY AUTOINCREMENT,"id" TEXT,"name" TEXT,"gender" TEXT,"avatar" TEXT)',
			sql: `create table if not exists ${tabName}(${data})`,
			success(e) {
				cosole.log("创建数据表成功")
				resolve(e);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	})
}

// 创建表
export const dropTab = (tabName) => {
	if(null == tabName || tabName.length == 0){
		return false;
	}
	// tabName不能用数字作为表格名的开头
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			// sql: 'create table if not exists dataList("list" INTEGER PRIMARY KEY AUTOINCREMENT,"id" TEXT,"name" TEXT,"gender" TEXT,"avatar" TEXT)',
			sql: `DROP TABLE ${tabName}`,
			success(e) {
				cosole.log(`删除数据表成功`)
				resolve(e);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	})
}

// 添加数据
export const addTabItem = (tabName,obj) => {
	if (obj) {
		let keys = Object.keys(obj)
		let keyStr = keys.toString()
		let valStr = ''
		keys.forEach((item, index) => {
			if (keys.length - 1 == index) {
				valStr += ('"' + obj[item] + '"')
			} else {
				valStr += ('"' + obj[item] + '",')
			}
		})
		console.log(valStr)
		let sqlStr = `insert into ${tabName}(${keyStr}) values(${valStr})`
		console.log(sqlStr)
		return new Promise((resolve, reject) => {
			plus.sqlite.executeSql({
				name: dbName,
				sql: sqlStr,
				success(e) {
					resolve(e);
				},
				fail(e) {
					console.log(e)
					reject(e);
				}
			})
		})
	} else {
		return new Promise((resolve, reject) => {
			reject("错误")
		})
	}
}
// 合并数据
export const mergeSql = (tabName,tabs) => {
	if (!tabs || tabs.length == 0) {
		return new Promise((resolve, reject) => {
			reject("错误")
		})
	}
	let itemValStr = ''
	tabs.forEach((item, index) => {
		let itemKey = Object.keys(item)
		let itemVal = ''
		itemKey.forEach((key, i) => {
			if (itemKey.length - 1 == i) {
				if (typeof item[key] == 'object') {
					itemVal += (`'${JSON.stringify(item[key])}'`)
				} else {
					itemVal += (`'${item[key]}'`)
				}
			} else {
				if (typeof item[key] == 'object') {
					itemVal += (`'${JSON.stringify(item[key])}',`)
				} else {
					itemVal += (`'${item[key]}',`)
				}
			}
		})
		if (tabs.length - 1 == index) {
			itemValStr += ('(' + itemVal + ')')
		} else {
			itemValStr += ('(' + itemVal + '),')
		}
	})
	let keys = Object.keys(tabs[0])
	let keyStr = keys.toString()
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql: `insert or ignore into ${tabName} (${keyStr}) values ${itemValStr}`,
			success(e) {
				resolve(e);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	})
}
// 获取分页数据库数据
export const getDataList = async (tabName, num, size,byName,byType) => {
	let count = 0
	let sql = ''
	let numindex = 0
	await getCount(tabName).then((resNum) => {
		count = Math.ceil(resNum[0].num / size)
	})
	if(((num - 1) * size) == 0) {
	    numindex = 0
	} else {
		numindex = ((num - 1) * size)
	}
	sql = `select * from ${tabName}`
	if(byName && byType) {
		// desc asc
		sql += ` order by ${byName} ${byType}`
	}
	sql += ` limit ${numindex},${size}`
	console.log(sql)
	if (count < num - 1) {
		return new Promise((resolve, reject) => {
			reject("无数据")
		});
	} else {
		return new Promise((resolve, reject) => {
			plus.sqlite.selectSql({
				name: dbName,
				// sql: "select * from userInfo limit 3 offset 3",
				sql:sql ,
				success(e) {
					resolve(e);
				},
				fail(e) {
					reject(e);
				}
			})
		})
	}
}

//查询数据库数据
export const selectDataList = (tabName,setData,byName,byType) => {
	let setStr = ''
	let sql = ''
	if (JSON.stringify(setData) !== '{}') {
		let dataKeys = Object.keys(setData)
		dataKeys.forEach((item, index) => {
			console.log(setData[item])
			setStr += (
				`${item}=${JSON.stringify(setData[item])}${dataKeys.length - 1 !== index ? " and " : ""}`)
		})
		sql = `select * from ${tabName} where ${setStr}`
	} else {
		sql = `select * from ${tabName}`
	}
	if(byName && byType) {
		// desc asc
		sql += ` order by ${byName} ${byType}`
	}
	console.log(sql)
	if (tabName !== undefined) {
		return new Promise((resolve, reject) => {
			plus.sqlite.selectSql({
				name: dbName,
				sql: sql,
				success(e) {
					resolve(e);
				},
				fail(e) {
					console.log(e)
					reject(e);
				}
			})
		})
	} else {
		return new Promise((resolve, reject) => {
			reject("错误")
		});
	}
}


//查询数据库数据
export const selectBySQL = (sql) => {
	console.log(sql)
	return new Promise((resolve, reject) => {
		plus.sqlite.selectSql({
			name: dbName,
			sql: sql,
			success(e) {
				console.log('success')
				resolve(e);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	})
	 
}

/**
 * 创建一般索引
 * @param tableName 表名
 * @param indexName 索引名
 * @param fieldName 字段名
 */
export const createIndex = (tableName, indexName, fieldName) => {
	let sql = `CREATE INDEX ${indexName} ON ${tableName} (${fieldName})`
	console.log('新建索引', sql)
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql: sql,
			success(e) {
				resolve(e);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	});
}

/**
 * 判断表索引是否存在
 * @param tableName 表名
 * @param indexName 索引名
 */
export const existsIndex = (tableName, indexName) => {
	let sql = `SELECT count(*)  num FROM sqlite_master WHERE type = 'index' and name = '${indexName}' and tbl_name = '${tableName}'`
	console.log(tableName, indexName, sql)
	return new Promise((resolve, reject) => {
		plus.sqlite.selectSql({
			name: dbName,
			sql: sql,
			success(e) {
				resolve(e);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	});
}

/**
 * 判断表字段是否存在
 * @param tableName 表名
 * @param fieldName 字段名
 */
export const existsField = (tableName, fieldName) => {
	let sql = `SELECT count(*)  num FROM sqlite_master WHERE type = 'table' and name = '${fieldName}' and tbl_name = '${tableName}'`
	console.log(tableName, fieldName, sql)
	return new Promise((resolve, reject) => {
		plus.sqlite.selectSql({
			name: dbName,
			sql: sql,
			success(e) {
				resolve(e);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	});
}

 



//把这些方法导出去
export const sqlite = {
	isOpen,
	openDb,
	createTab,dropTab,
	mergeSql,
	getDataList,
	addTabItem,
	closeSQL,
	deleteInformationType,
	getTable,
	getCount,
	updateSQL,
	isTable,
	selectDataList,
	selectBySQL,updateBySQL,
	createIndex, 
	existsIndex,
	existsField,
};

4、打开数据库

在App.vue 文件的onLaunch: function() {} 函数中

sqlite 需要依赖存储权限,因此需要在成功获取权限后,初始化相关操作。

// 判断有没有存储权限
			var _this = this
			plus.android.requestPermissions(['android.permission.WRITE_EXTERNAL_STORAGE'], function(e) {
				console.log(e.deniedPresent)
				if (e.deniedAlways.length > 0) { //权限被永久拒绝
					// 弹出提示框解释为何需要读写手机储存权限,引导用户打开设置页面开启
					uni.showModal({
						title: '存储权限',
						content: '您拒绝了存储权限,请去设置-应用开启存储权限。',
						success: function (res) {
							if (res.confirm) {
								// console.log('用户点击确定');
							} else if (res.cancel) {
								// console.log('用户点击取消');
							}
						}
					});
				}
				if (e.deniedPresent.length > 0) { //权限被临时拒绝
					// 弹出提示框解释为何需要读写手机储存权限,可再次调用plus.android.requestPermissions申请权限
					plus.android.requestPermissions(['android.permission.WRITE_EXTERNAL_STORAGE'])
					// console.log('666666666 ' + e.deniedPresent.toString());
				}
				if (e.granted.length > 0) { //权限被允许
					//调用依赖获取读写手机储存权限的代码
					// _this.upload() // 获取权限成功之后调用的函数
					// console.log('2222222222 ' + e.granted.toString());
					if(!sqlite.isOpen()){
						sqlite.openDb().then((res) => {
							SysBoxDetail.init();
                            // ......
						});
					}
				}
				
				
				
			}, function(e) {
				// console.log('R12133313221' + JSON.stringify(e));
			});

5、查询数据

在sqlite表的脚本文件中,已将所有函数export

在vue中,先引入相关文件,后续可以直接使用

import {SysBoxDetail}  from '@/db/sqlite/boxDetail.js'
SysBoxDetail.selectAll(this.queryParams).then((res) => {
	console.log(res)
})

6、可视化测试

<template>
	<view class="content">
		<view class="">
			表名
		</view>
		<radio-group @change="radioChange">
			<label class="uni-list-cell uni-list-cell-pd" v-for="(item, index) in tableList" :key="index">
				<view>
					<radio :value="index" :checked="index == radioIndex" />{{item.name}}
				</view>
			</label>
		</radio-group>
		<button type="primary" @click="dbType">检查数据库打开状态</button>
		<button type="primary" @click="openDb">打开数据库</button>
		<button type="primary" @click="closeDb">关闭数据库</button>
		<input class="input_box" type="text" value="" v-model="valInp" placeholder="请输入聊天内容" />
		<button type="primary" @click="addSql">添加数据</button>
		<button type="primary" @click="setSql">修改数据</button>
		<input class="input_box" type="text" value="" v-model="valTab" placeholder="请输入表名" />
		<button type="primary" @click="addExecuteSql">添加表</button>
		<button type="primary" @click="tapMerge">合并数据</button>
		<button type="primary" @click="delSql">删除数据库数据</button>
		<button type="primary" @click="getTab">查询所有数据表名</button>
		<button type="primary" @click="tapIsTab">查询表是否存在</button>
		<button type="primary" @click="getNum">获取表数据总条数</button>
		<button type="primary" @click="getSql">获取数据库数据</button>
		<button type="primary" @click="getBranch">获取分页数据库数据+排序</button>
		<t-table class="table_box" :chatTableListLength="chatTableListLength" :chatTableList="chatTableList">
		</t-table>
	</view>
</template>

<script>
	import {
		*
	} from '@/db/sqlite/index.js'
	export default {
		components: {
			tTable
		},
		data() {
			return {
				valTab:'',
				radioIndex:0,
				valInp: '',
				chatTableList: [],
				tableList:[],
				chatTableListLength: 0,
				tableName:''
			}
		},
		async onLoad() {
			await this.openDb()
			await this.getTab()
		},
		methods: {
			radioChange(val) {
				this.tableName = this.tableList[val.detail.value].name
				console.log(this.tableList)
			},
			tapMerge() {
				let tabs = [{
					"local_id": "3_wtsu83kox2",
					"id": "3_wtsu83koxx",
					"chat_friend_id": "兔兔",
					"content": 2
				}, {
					"local_id": "3_hq5uyx9vrd",
					"id": "3_hq5uyx9vrd",
					"chat_friend_id": "兔兔",
					"content": 2
				}]
				// 只会插入不重复的
				mergeSql('pop', this.tableName, tabs).then((res) => {
					console.log(res)
				})
			},
			tapIsTab() {
				isTable('pop', this.tableName).then((res) => {
					console.log(res)
				})
			},
			getTab() {
				getTable('pop').then((res) => {
					console.log(res)
					this.tableList = res
				})
			},
			addExecuteSql() {
				console.log(this.valTab)
				if(!this.valTab || this.valTab == '') return
				addTab('pop', this.valTab).then(res => {
					console.log(res)
					this.valTab = ''
					this.getTab()
				})
			},
			delSql() {
				deleteInformationType('pop', this.tableName, {
					"chat_i": 2,
				}).then(res => {
					console.log(res)
				})
			},
			dbType() {
				uni.showToast({
					icon: "none",
					title: isOpen('pop') ? '数据库已打开' : '数据库已关闭'
				})
			},
			closeDb() {
				closeSQL().then(res => {
					console.log(res)

				})
			},
			openDb() {
				if (isOpen('pop')) return
				openDb('pop').then(res => {
					console.log(res)
				})
			},
			setSql() {
				updateSQL('pop', this.tableName, {
					chat_friend_id: 'Texas3333666',
					content: '3333666'
				}, 'local_id', '3_bpu8sufahoe').then(res => {
					console.log('1111')
				})
			},
			addSql() {
				console.log(this.valInp)
				console.log(this.tableName)
				let _this = this
				if (this.valInp == '') {
					uni.showToast({
						icon: "none",
						title: "请输入聊天内容"
					})
					return
				}
				let objMsg = {}
				let local_id = 3 + '_' + this.getLocalId()
				let content = {}
				content.voiceTime = 0
				content.url = ''
				content.tempFilePath = ''
				content.text = this.valInp
				objMsg.id = local_id
				objMsg.chat_friend_id = 3
				objMsg.user_id = 1
				objMsg.local_id = local_id
				objMsg.is_read = 0
				objMsg.status = 0
				objMsg.send_time = parseInt(new Date().getTime() / 1000)
				objMsg.msg_type = 1
				objMsg.content = JSON.stringify(content)
				addTabItem('pop', _this.tableName, {
					id: objMsg.id,
					local_id: objMsg.id,
					content: '2',
					chat_friend_id: _this.valInp,
				}).then((res) => {
					_this.valInp = ''
					console.log(_this.valInp)
				})
			},
			// 获取本地id
			getLocalId() {
				return Math.random().toString(36).slice(2)
			},
			getSql() {
				selectDataList('pop', this.tableName,{}).then(res => {
					console.log(res)
					this.chatTableList = res
				})
			},
			getBranch() {
				getDataList('pop', this.tableName, 1, 20, 'chat_i', 'desc').then(res => {
					console.log(res)
					this.chatTableList = res
				}).catch(err => {
					console.log(err)
				})
			},
			getNum() {
				getCount('pop', this.tableName).then(res => {
					this.chatTableListLength = res[0].num
				})
			}
		}
	}
</script>

<style>
	.content button {
		margin-bottom: 20rpx;
	}

	.input_box {
		width: 690rpx;
		height: 80rpx;
		font-size: 40rpx;
		line-height: 40rpx;
		margin: 10rpx auto;
		background-color: pink;
	}

	.table_box {
		width: 690rpx;
		margin: 10rpx auto;
		text-align: center;
	}
</style>

参照文章

SQLite 教程 | 菜鸟教程 (runoob.com)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全】服务基础第一阶段——第八节:Windows系统管理基础---- Web服务与虚拟主机

目录 一、WWW概述 1.1 HTML 1.2 URI与URL 1.2.1 URL&#xff08;统一资源标识符&#xff0c;Uniform Resource Locator&#xff09; 1.3 HTTP 1.3.1 HTTP请求&#xff1a; 1.3.2 HTTP响应 1.3.3 状态码 1.4常见Web URL格式 实验一、网站搭建 1&#xff09;访问失败可…

实训day29(8.15)

一、python管理mysql 1、搭建主mysql [rootmysql57 ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootmysql57 ~]# cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql [rootmysql57 ~]# rm -rf /etc/my.cnf [rootmysql57 ~]# mkdir /usr/local/mysql…

DCB简介

DCB协议组主要用于构建无丢包以太网&#xff0c;以满足数据中心网络融合后的QoS需求。 数据中心网络融合后&#xff0c;LAN、SAN和IPC流量的QoS需求上存在较大的差异&#xff1a; SAN流量对丢包很敏感且要求报文在传输过程中是保序的。LAN流量允许丢包&#xff0c;只需要设备…

MySQL基础学习:MySQL主从复制如何实现

这里写自定义目录标题 一、为什么使用MySQL主从二、主从复制原理是什么三、如何保证主从一致 一、为什么使用MySQL主从 保证服务的高可用&#xff1a;当主机宕机的时候可以选择一个从节点作为主节点&#xff0c;保证了我们服务的高可用。保证容灾备份&#xff1a;主库上的磁盘…

每日AIGC最新进展(54):中科大提出Pose引导的图像生成模型、韩国科技学院提出发型控制模型、北大提出风格生成数据集CSGO

Diffusion Models专栏文章汇总&#xff1a;入门与实战 GRPose: Learning Graph Relations for Human Image Generation with Pose Priors 在过去的研究中&#xff0c;基于扩散模型的人工生成技术在根据特定条件合成高质量人像方面取得了显著进展。然而&#xff0c;尽管之前的方…

【算法】前缀和例题讲解

例一&#xff1a; 724. 寻找数组的中心下标 思路&#xff1a; 典型的前缀和题目&#xff0c;我们只需要创建前缀和数组和后缀和数组&#xff0c;然后一一寻找两者相等的下标即可。 代码&#xff1a; class Solution { public:int pivotIndex(vector<int>& nums) …

华发股份:销售排名稳居TOP10 谱写高质量发展新篇章

2024年8月30日晚&#xff0c;华发股份&#xff08;600325.SH&#xff09;发布2024年半年度报告。报告显示&#xff0c;公司实现营业总收入248.42亿元&#xff0c;归母净利润12.65亿元。面对复杂多变的宏观环境和行业调整的挑战&#xff0c;华发股份依然能够稳固其经营根基&…

Elastic Search(五):索引生命周期管理 - ilm

目录 1 ES&#xff1a;索引生命周期管理 - ilm1.1 介绍1、ILM阶段转换阶段执行阶段操作 1.2 索引生命周期操作1、设置 索引生命周期 1.3 索引生命周期管理1、创建 生命周期策略2、创建索引模板&#xff0c;模板中关联 policy3、创建符合模板的起始索引&#xff0c;设置别名(即我…

无人机操控师技术及前景详解

随着科技的飞速发展和无人机技术的日益成熟&#xff0c;无人机在各行各业的应用越来越广泛&#xff0c;从农业植保、物流配送到影视拍摄、灾害救援&#xff0c;无人机技术正深刻改变着传统行业的运作模式。在这一背景下&#xff0c;无人机操控师作为无人机技术的核心操作者&…

Oracle查询优化--分区表建立/普通表转分区表

本文介绍了Oracle表分区的方法&#xff0c;将已有的非分区表转化为分区表&#xff0c;也可以直接建立新的分区表&#xff0c;从而实现大表查询的优化。主要通过DBMS_REDEFINITION 和 alter table xxx modify 方法&#xff0c;DBMS_REDEFINITION 适用于所有版本&#xff0c;操作…

Spring扩展点系列-InitializingBean

文章目录 简介应用场景代码示例运行示例 简介 这篇文章主要介绍了Spring中InitializingBean的使用详细解析&#xff0c;InitializingBean是Spring提供的拓展性接口&#xff0c;提供了属性初始化后的处理方法,它只有一个afterPropertiesSet方法&#xff0c;凡是继承该接口的类&…

8G 显存玩转书生大模型

1. 启动demo 输出300字小故事 2. Streamlit Web Demo 部署InternLM2-Chat-1.8B 模型 安装依赖 让他输出helloworld

java基础 之 接口

文章目录 前言接口浅浅理解下接口抽象类与接口的爱恨情仇特点接口的回调 抽象类和接口相同之处区别 前言 前文回顾 戳这里→java基础 之 抽象类 因为接口是对抽象类的一种延伸&#xff0c;所以请先了解一下抽象类会更好的理解接口哦 子类对抽象类叫继承&#xff0c;使用关键字e…

Python 从入门到实战3(列表的简单操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过python小栗子来学习python基础知识语法&#xff…

怎样还原空白试卷?2024快速空白试卷还原软件合集

怎样还原空白试卷&#xff1f;2024快速空白试卷还原软件合集 在教育和考试过程中&#xff0c;有时需要将已经填写过的试卷还原为空白状态&#xff0c;以便重新使用或进行复印。通过使用特定的软件&#xff0c;你可以轻松地去除试卷上的手写内容或标记&#xff0c;恢复试卷的空…

【网络安全 | 虚拟机】VMware Workstation Pro下载安装使用教程(免费版)

未经许可,不得转载。 文章目录 下载安装使用(Centos)下载 进入官网页面,注册账户: https://profile.broadcom.com/web/registration注册后登录(用户名为邮箱),选择My Downloads: 如图选择: 如图选择: 如图选择: 如图选择:

嵌入式Linux C应用编程指南-进程、线程(速记版)

第九章 进程 9.1 进程与程序 9.1.1 main()函数由谁调用&#xff1f; C 语言程序总是从 main 函数开始执行&#xff0c;main()函数的原型是&#xff1a; int main(void) 或 int main(int argc, char *argv[])。 操作系统下的应用程序在运行 main()函数之前需要先执行一段引导代…

性能炸裂的数据可视化分析工具:DataEase!【送源码】

今天分享一款开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务的改进与优化。支持丰富的数据源连接&#xff0c;能够通过拖拉拽方式快速制作图表&#xff0c;并可以方便地与他人分享。 技术栈 前端&#xff1a;Vue.js、Elemen…

【网络基础】探索 NAT 技术:IP 转换、NAPT、NAT穿越及代理服务器

文章目录 1. 前言2. IP 转换过程3. NAPT① 基本概念② 工作原理③ 优缺点④ 实际应用 4. 缺陷5. NAT 穿越① 概述② 示例 6. NAT 与 代理服务器① 代理服务器与NAT的区别&#xff1a;② 正向代理 / 反向代理 服务器 1. 前言 NAT&#xff08;网络地址转换&#xff09;是一种常见…

路由策略工具

1.产生背景 a.保证数据访问的安全性 b.提高链路带宽利用率 c.流量路径不优 2.解决方案: 解决方案一:路由策略:可通过修改路由条目(即对接收和发布的路由进行过滤)来控制流量可达性 解决方案二:流量过滤:可使用Traffic-Filter工具对数据直接进行过滤 3.路由策略工具 a.可利…