封装webSQL(一)做个help先

首先,webSQL并不在HTML的标准内,这里封装 webSQL 主要是为了后端的 MySQL。

因为想在前端做一个缓存机制,实现一些类似于 git 的功能,这个以后在细说,总之,想按照后端封装MySQL的方式,封装一下webSQL,实现接口、参数、返回值基本一致,或者类似。

SQL 的操作都很基础,核心就是两件事情:打开连接,传递SQL,得到结果。

我们先封装一个help。

/**
 * 基于 promise 封装 webSQL 的基本操作
 * * 创建数据库连接
 * * 提交SQL给数据库执行,得到返回结果
 * * 共用函数
 * * info 结构:
 * * * dbName: 'test',  // 数据库名称
 * * * ver: '1', // 版本,很重要
 * * * size: '2', // 大小,自动 * 1024 * 1024
 * * * description: '数据库描述'
 */
export default class MySQLHelp {
  constructor (info) {
    // 创建普通连接的参数
    this._info = {
      dbName: info.dbName,
      ver: info.ver,
      size: info.size,
      description: info.infodescription
    }
    // 打开数据库
    this.db = window.openDatabase(
      this._info.dbName,
      this._info.ver,
      this._info.description,
      this._info.size * 1024 * 1024)
    
    console.log(` ★ 初始化!${info.dbName}`)
  }
 

  /**
   * 开启一个事务,Promise 的方式
   * @returns Promise 形式
   */
  begin() {
    const myPromise = new Promise((resolve, reject) => {
      // 开启一个事务。
      console.log('★ 开启事务,promise 模式')
      this.db.transaction(
        (tx) => { resolve(tx) },
        (tx, err) => {reject(err)}
      )
    })
    return myPromise
  }
  
  /**
   * 直接运行SQL
   * @param { string } sql SQL语句
   * @param { arror } param 参数
   * @returns promise
   */
   query (sql, param=[], cn = null) {
    const promise1 = new Promise((resolve, reject) => {
      const _query = (_cn) => {
        _cn.executeSql(
          sql, param,
          (tx, results) => { resolve(results) },
          (tx, err) => {
            console.log('query - sql:', sql, param, tx, err)
            reject(err)
            return true // 回滚
          }
        )
      }
      if (cn === null) {
        this.begin().then((__cn) => {
          _query(__cn)
        })
      } else {
        _query(cn)
      }
    })
    return promise1
  }
}

  • window.openDatabase
    创建并且打开一个数据库

  • begin() db.transaction
    开启一个事务。似乎好像必须先开始事务,然后才可以访问数据库。所以把这个拿出来单独封装一个函数,主要是为了能够连续使用事务。

  • query(sql, param=[], cn = null)
    把 SQL 提交给数据库执行(含参数),然后等待返回结果。
    这里写的有点绕,主要是想兼容是否使用事务的两种用法。

使用方式


// 测试webSQL的访问
import webSQL from '../../packages/nf-ws-indexeddb/help.js'

const info = {
  dbName: 'test_websqldb',
  ver: '1',
  size: 2,
  description: '测试一下新的封装方式'
}
const help = new webSQL(info)

const tableName = 't_table'
const cols = ['a','b']
const sql = `CREATE TABLE IF NOT EXISTS ${tableName} (ID INTEGER PRIMARY KEY ASC, ${cols.join(',')} )`

help.query(sql, []).then((res) => {
  console.log('建表完毕', res)

  // const sql2 = 'insert into t_table (id,a,b) values (0,?,?)'
  const sql2 = 'insert into t_table (a,b) values (?,?)'
  const param = ['111','ddd']
  help.query(sql2, param).then((res) => {
    console.log('添加数据:', res)
  })
})

  • 建立对象
    首先 import 进来,然 new 一个对象出来。

  • 建表
    后端的MySQL可以在上线前先把数据库准备好,但是前端的webSQL就得每次运行前先检查是否已经有表,所以第一步是建立一个表。
    webSQL 比较宽松,似乎没有对字段类型进行检查,所以建表的时候也就不去定义字段类型了。

  • 添加数据
    再做一个添加数据的测试。

其他用法

  • 连续用法

const tableName = 't_table'
const cols = ['a','b']
const sql = `CREATE TABLE IF NOT EXISTS ${tableName} (ID INTEGER PRIMARY KEY ASC, ${cols.join(',')} )`

help.query(sql, []).then((res) => {
  console.log('建表完毕', res)
})

const sql2 = 'insert into t_table (a,b) values (?,?)'
const param = ['222','eee']
help.query(sql2, param).then((res) => {
  console.log('添加数据:', res)
})

因为 js 是单线程的,所以其实我们可以依次写代码,而不必把下一条放在回调函数里面。

依次执行

其实这种用法开启了两次事务。

  • 事务用法

help.begin().then((cn) => {
  help.query(sql, [], cn).then((res) => {
    console.log('建表完毕', res)
  })
  help.query(sql2, param, cn).then((res) => {
    console.log('添加数据:', res)
  })
})

我们可以显性开始事务,这样就不必多次开启事务了。

开启事务

不用提交事务?

事务好像是默认提交的。
如果要回滚事务的话,需要第四个参数(最后一个回调函数) return true。

添加的数据

两个事务同时写会如何?

// 事务一
help.begin().then((cn) => {
  param[1] = '11'
  help.query(sql2, param, cn).then((res) => {
    console.log('添加数据:', res)
  })
  param[1] = '22'
  help.query(sql2, param, cn).then((res) => {
    console.log('添加数据:', res)
  })
  param[1] = '33'
  help.query('', param, cn).then((res) => { // 触发回滚
    console.log('添加数据:', res)
  })
})

// 事务二
help.begin().then((cn) => {
  param[1] = '66'
  help.query(sql2, param, cn).then((res) => {
    console.log('添加数据:', res)
  })
  param[1] = '77'
  help.query(sql2, param, cn).then((res) => {
    console.log('添加数据:', res)
  })
  param[1] = '88'
  help.query(sql2, param, cn).then((res) => {
    console.log('添加数据:', res)
  })
})

测试了一下,感觉和后端的 node + MySQL 不太一样。

前端并没有出现交替添加的情况,而是依次添加。可能是因为,都是单线程的原因吧。

事务也可以独立回滚,不会影响另一个事务。

就这?

当然不是,这只是最基础的操作,后面更精彩。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • Web SQL 首先呢,HTML5已经放弃了 Web SQL,这里做这个封装,主要是为了练手,另外是为了做在线演示...
    自然框架阅读 605评论 0 3
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,928评论 2 89
  • 本文介绍本地数据存储的选型。简单总结一些查询到的关于本地数据存储的技术。 控制台展示前端存储 Chrome: 前端...
    谢大见阅读 9,066评论 1 8
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,235评论 11 349
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,850评论 2 7