关系型数据库,可以通过SQL指定要修改的字段,而不是必须完整的修改。
而对象的修改,是把对象整体放入(替换),如果对象结构简单属性少的话,也没啥问题,但是如果属性特别多呢?
所以我想是否可以传入部分属性,也可以修改呢?
修改对象
相当于关系型数据库里的修改记录。indexedDB的步骤是:
- 打开数据库
- 开启事务
- 打开对象仓库(表)
- 获取仓库里的对象
- 叠加属性
- 替换对象
打开数据库的操作,在help里面已经实现了。
开启事务,可以通过help开启,也可以不显性开启,而是默认开启,然后就是开仓库装对象了。
/**
* 修改对象
* @param { IndexedDBHelp } help 访问数据库的实例
* @param { string } storeName 仓库名称(表名)
* @param { Object } model 对象(数据记录)
* @param { IDBTransaction } tranRequest 如果使用事务的话,需要传递开启事务时创建的连接对象
* @returns
*/
export default function updateData (help, storeName, model, id, tranRequest = null) {
const _model = help._vueToObject(model)
// 定义一个 Promise 的实例
return new Promise((resolve, reject) => {
// 定义个函数,便于调用
const _update = (__tran) => {
// 先获取对象,然后修改对象,最后存回去
const store = __tran.objectStore(storeName) // 获取store
store.get(id) // 获取对象
.onsuccess = (event) => {
// 从仓库里提取对象,把修改值合并到对象里面。
const newObject = {}
Object.assign(newObject, event.target.result, _model)
// 修改数据
store.put(newObject) // 修改对象
.onsuccess = (event) => {
resolve(event.target.result)
}
}
}
// 判断是否自带事务
if (tranRequest === null) {
help.beginWrite([storeName]).then((tran) => {
// 自己开一个事务
_update(tran)
})
} else {
// 使用传递过来的事务
_update(tranRequest)
}
})
}
使用方式
// 引入help
import { updateModel } from '../../../packages/websql.js'
/**
* 实现修改服务
* @param {object} userInfo 当前登录人的信息
* @param {object} help 访问数据库的实例
* @param {objec} info 服务的 meta
* @param {object} model
* @param {number|string} id 记录ID
* @returns 返回新添加的记录的ID
*/
export default function update (userInfo, help, info, model, id) {
return new Promise((resolve, reject) => {
updateModel(help, info, model, id).then((count) => {
resolve({ count })
}).catch((err) => {
reject(err)
})
})
}
效果
网友评论