天天看點

使用ES6 Class封裝的IndexDB 操作類,并實作模糊搜尋

 封裝如下:

indexDBOperate.js      
export class IndexDBOperate {

    db = null // 資料庫執行個體

    databaseName = null // 資料庫名稱

    version = null // 資料庫版本

    objStoName = null // 表或對象倉庫名稱

    constructor(databaseName, version, objStoName, indexObj, successFunc) {

        this.databaseName = databaseName
        this.version = version
        this.objStoName = objStoName

        // 若無此資料庫則會建立
        const request = window.indexedDB.open(databaseName, version)
        request.onerror = e => {
            console.log('資料庫打開報錯')
        }

        request.onsuccess = e => {
            this.db = request.result
            const db = request.result

            console.log('資料庫打開成功')
            // 建表或對象倉庫,id作為主鍵

            successFunc(db)
        }

        // 如果指定的版本号,大于資料庫的實際版本号,就會發生資料庫更新事件
        // 第一次打開資料庫時,會先觸發upgradeneeded事件,然後觸發success事件
        request.onupgradeneeded = e => {
            // console.log('資料庫打開/建立報錯')
            // this.db = e.target.result
            const db = e.target.result

            if (!db.objectStoreNames.contains(objStoName)) {
                // 建表
                const objectStore = db.createObjectStore(objStoName, { keyPath: 'id' });

                // 建立索引(索引名稱、索引所在的屬性、配置對象(說明該屬性是否包含重複的值))
                objectStore.createIndex(indexObj.indexName, indexObj.IndexAattrOf, indexObj.config)
            }

        }

        request.blocked = e => {
            // console.log('上一次的資料庫連接配接還未關閉')
        }
    }

    // 建立
    createData = data => {
        const request = this.db.transaction([`${this.objStoName}`], 'readwrite')
            .objectStore(`${this.objStoName}`)
            .add(data)

        request.onsuccess = e => {
            console.log('資料寫入成功')
        }

        request.onerror = e => {
            console.log('資料寫入失敗', e.target.error)
        }
    }

    // 更新
    updateData = data => {
        const request = this.db.transaction([`${this.objStoName}`], 'readwrite').objectStore(`${this.objStoName}`)
            .put(data)

        request.onsuccess = e => {
            // console.log('資料更新成功')
        };

        request.onerror = e => {
            // console.log('資料更新失敗')
        }
    }

    // 讀
    retrieveData = (id, successFunc) => {
        const transaction = this.db.transaction([`${this.objStoName}`])
        const objectStore = transaction.objectStore(`${this.objStoName}`)
        const request = objectStore.get(id)

        request.onerror = e => {
            // console.log('事務失敗')
        };

        request.onsuccess = e => {
            if (request.result) {
                successFunc(request.result)
                //  console.log('Name: ' + request.result.name)
                //  console.log('Age: ' + request.result.age)
                //  console.log('Email: ' + request.result.email)
            } else {
                //  console.log('未獲得資料記錄')
            }
        };
    }

    // 周遊
    readAllData = successFunc => {
        const objectStore = this.db.transaction([`${this.objStoName}`], 'readwrite')
            .objectStore(`${this.objStoName}`)

        objectStore.openCursor().onsuccess = e => {
            const cursor = e.target.result

            if (cursor) {
                successFunc(cursor)
                cursor.continue()
                // console.log('Id: ' + cursor.key)
                // console.log('Name: ' + cursor.value.name)
                // console.log('Age: ' + cursor.value.age)
                // console.log('Email: ' + cursor.value.email)
            } else {
                // console.log('沒有更多資料了!')
            }
        };
    }

    // 周遊(加入模糊搜尋)
    fuzzySearchData = (field, keyWord, successFunc) => {
        const objectStore = this.db.transaction([`${this.objStoName}`], 'readwrite')
            .objectStore(`${this.objStoName}`)
        const data = []

        objectStore.openCursor().onsuccess = e => {
            const cursor = e.target.result

            if (cursor) {
                if (cursor.value[`${field}`].indexOf(keyWord) >= 0) {
                    data.push(cursor.value)
                }
                cursor.continue()

                // console.log('Id: ' + cursor.key)
                // console.log('Name: ' + cursor.value.name)
                // console.log('Age: ' + cursor.value.age)
                // console.log('Email: ' + cursor.value.email)
            } else {
                // console.log('沒有更多資料了!')
                successFunc(data)
            }
        };
    }

    deleteData = id => {
        const request = this.db.transaction([`${this.objStoName}`], 'readwrite')
            .objectStore(`${this.objStoName}`)
            .delete(id)

        request.onsuccess = e => {
            // console.log('資料删除成功')
        };
    }

    // 通過索引擷取資料
    retrieveByIndex = (indexName, searchTerm, successFunc) => {
        const transaction = this.db.transaction([`${this.objStoName}`], 'readonly')
        const store = transaction.objectStore(`${this.objStoName}`)
        const index = store.index(`${indexName}`)
        const request = index.get(`${searchTerm}`)

        request.onsuccess = e => {
            const { result } = e.target
            console.log(e.target)
            if (result) {
                // ...
                successFunc(result)
            } else {
                // ...
            }
        }
    }
}// 封裝by 有蚊子 @2019.11.20       

使用示例:

// indexDB調用示例
  handleDB = () => {
    const indexDB = new IndexDBOperate('chat_help_db', 1, 'chat_help', {
      indexName: 'name',
      IndexAattrOf: 'name',
      config: {
        unique: false,
      },
    }, db => {

      indexDB.fuzzySearchData('name', 'a', result => {
        console.log(result)
      })
      indexDB.createData({ id: 7, name: 'aaa' })
      indexDB.updateData({ id: 3, name: 'a2' })
      indexDB.retrieveByIndex('name', 'a', result => {
         console.log(result)
      }) 
      indexDB.deleteData(7)
      indexDB.retrieveData(1, result => {
         console.log(result)
      })
      indexDB.readAllData(result => {
         console.log(result)
      })
    })
  }      

 參考資料:

1. http://www.ruanyifeng.com/blog/2018/07/indexeddb.html 阮一峰indexdb使用

2.https://wangdoc.com/javascript/bom/indexeddb.html#idbindex-%E5%AF%B9%E8%B1%A1 indexdb api文檔