封装 indexedDB(六)修改对象

作者: 自然框架 | 来源:发表于2021-08-07 18:28 被阅读0次

    关系型数据库,可以通过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) 
        })
      })
    }
    
    效果

    源码

    https://gitee.com/naturefw/nf-plat-vite2-vue3

    相关文章

      网友评论

        本文标题:封装 indexedDB(六)修改对象

        本文链接:https://www.haomeiwen.com/subject/oesgvltx.html