IndexedDB使用(基本函数封到Angular2的service里)
生活随笔
收集整理的這篇文章主要介紹了
IndexedDB使用(基本函数封到Angular2的service里)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
IndexedDB使用
使用場(chǎng)景
- 具體使用場(chǎng)景:
存儲(chǔ)用戶(hù)瀏覽記錄。
- 適合的使用場(chǎng)景:
相關(guān)站點(diǎn)
ps:那么多好的資料了,為什么還寫(xiě)博客?
代碼段
代碼段來(lái)自項(xiàng)目,當(dāng)然是底層的與項(xiàng)目無(wú)關(guān)。這部分代碼大部分是已有的,來(lái)自一個(gè)已經(jīng)離開(kāi)項(xiàng)目的同事,我寫(xiě)了一部分。在此我只是記錄下而已。
// 項(xiàng)目使用的是Angular2,這是一個(gè)service。有關(guān)Angular2的寫(xiě)法我不做說(shuō)明。 import { Injectable } from '@angular/core';@Injectable() export class WorkIndexedDBService {// 聲明一些屬性,name:數(shù)據(jù)庫(kù)名,version:數(shù)據(jù)庫(kù)版本// name和version發(fā)生變化,瀏覽器就會(huì)重新建一個(gè)新的indexedDBprivate name: string = 'test-docView';private version: number = 1;private db: any = null;constructor() { }// 打開(kāi)并創(chuàng)建數(shù)據(jù)庫(kù)public open(): Promise<any> {return new Promise<any>((resolve, reject) => {// 打開(kāi)indexedDBlet req = indexedDB.open(this.name, this.version);// 打開(kāi)DB成功后的回調(diào)req.onsuccess = function(event) {this.db = event.target.result;resolve();}.bind(this); // 此處說(shuō)明.bind(this),是為了把當(dāng)前類(lèi)的屬性和方法傳入req.onsuccess的這個(gè)function里。即:.bind(this)的this是指本類(lèi)WorkIndexedDBService// 打開(kāi)DB失敗后的回調(diào)req.onerror = reject;// 打開(kāi)新的數(shù)據(jù)庫(kù)時(shí),會(huì)回調(diào)此函數(shù),改變name和version均會(huì)建立新的DB,所以都會(huì)發(fā)生此回調(diào)。req.onupgradeneeded = function(event) {// 如果版本升級(jí)要記得刪除舊的數(shù)據(jù)庫(kù)表再建立新的。this.db = event.target.result;let storeNames = this.db.objectStoreNames;if (storeNames && storeNames.length > 0) {for (let i = 0 ; i < storeNames.length ; i++) {this.db.deleteObjectStore(storeNames[i]);console.log('deleteObjectStore', storeNames[i]);}}// 創(chuàng)建數(shù)據(jù)庫(kù)表this.createViewDB();}.bind(this);});}// 關(guān)閉數(shù)據(jù)庫(kù)public close(): void {this.db.close();}// 刪除數(shù)據(jù)庫(kù)public deleteDB(): Promise<any> {return new Promise<any>((resolve, reject) => {// 先關(guān)閉連接再刪this.close();let req = indexedDB.deleteDatabase(this.name);req.onsuccess = function(event) {this.db = null;resolve();}.bind(this);req.onerror = reject;});}// 添加數(shù)據(jù)// 注意:使用事務(wù)來(lái)做操作比較快。public insert(storeName: string,data: any): Promise<any> {return new Promise<any>((resolve, reject) => {let transaction = this.db.transaction(storeName, 'readwrite');let store = transaction.objectStore(storeName);let req = store.add(data);req.onsuccess = function(event) {resolve(req.result);};req.onerror = reject;});}// 批量添加數(shù)據(jù)public batchInsert(storeName: string,data: any[]): Promise<any> {if (!data || data.length === 0) {return Promise.resolve();}let transaction = this.db.transaction(storeName, 'readwrite');let store = transaction.objectStore(storeName);return new Promise<null>((resolve, reject) => {data.forEach(row => store.add(row);});transaction.oncomplete = resolve;transaction.onerror = reject;}).catch((error) => {console.error('添加' + storeName + '表數(shù)據(jù)失敗', error);return Promise.reject(error);});}// 刪除數(shù)據(jù)public workdelete(storeName: string,keyValue: any): Promise<any> {return new Promise<any>((resolve, reject) => {let transaction = this.db.transaction(storeName, 'readwrite');let store = transaction.objectStore(storeName);let req = store.delete(keyValue);req.onsuccess = resolve;req.onerror = reject;});}// 清楚全部數(shù)據(jù)public clearAllData(): Promise<any> {let storeNameList: Array<string> = new Array<string>();let storeNames = this.db.objectStoreNames;if (storeNames && storeNames.length > 0) {for (let i = 0 ; i < storeNames.length ; i++) {storeNameList.push(storeNames[i]);}}return Promise.all(storeNameList.map((storeName) => {return this.clear(storeName);}));}// 清空數(shù)據(jù)public clear(storeName: string): Promise<any> {return new Promise<any>((resolve, reject) => {let transaction = this.db.transaction(storeName, 'readwrite');let store = transaction.objectStore(storeName);let req = store.clear();req.onsuccess = resolve;req.onerror = reject;});}// 更新數(shù)據(jù)public update(storeName: string,data: any): Promise<any> {return new Promise<any>((resolve, reject) => {let transaction = this.db.transaction(storeName, 'readwrite');let store = transaction.objectStore(storeName);let req = store.put(data);req.onsuccess = resolve;req.onerror = reject;});}// 根據(jù)Key取得數(shù)據(jù)public selectByKey(storeName: string,keyValue: any): Promise<any> {return new Promise<any>((resolve, reject) => {let transaction = this.db.transaction(storeName, 'readonly');let store = transaction.objectStore(storeName);let req = store.get(keyValue);req.onsuccess = function() {resolve(req.result);}req.onerror = reject;});}// 根據(jù)索引取得數(shù)據(jù)public selectByIndex(storeName: string,indexName: string,indexValue: any): Promise<any[]> {return new Promise<any[]>((resolve, reject) => {let transaction = this.db.transaction(storeName, 'readonly');let store = transaction.objectStore(storeName);let index = store.index(indexName);let req = index.openCursor(indexValue);let result: any[] = new Array<any>();req.onsuccess = function(event) {let cursor = event.target.result;if (cursor) {result.push(cursor.value);cursor.continue();} else {resolve(result);}}req.onerror = reject;});}// 批量合并數(shù)據(jù)public batchMerge(storeName: string,data: any[],delFlagColName?: string,delFlagColName2?: string): Promise<any> {if (!data || data.length === 0) {return Promise.resolve();}let transaction = this.db.transaction(storeName, 'readwrite');let store = transaction.objectStore(storeName);return new Promise<null>((resolve, reject) => {data.forEach(row => {let keyPath = store.keyPath;let keyValue;if (typeof keyPath === 'string') {keyValue = row[keyPath];} else {keyValue = new Array();keyPath.forEach(key => {keyValue.push(row[key]);});}store.delete(keyValue);} else {store.put(row);}});transaction.oncomplete = resolve;transaction.onerror = reject;}).catch((error) => {console.error('更新' + storeName + '表數(shù)據(jù)失敗', error);return Promise.reject(error);});}// 數(shù)據(jù)庫(kù)初始化處理private createDB(): void {this.createConfigInfo();this.createStoreUserInfo();this.createStoreOrgInfo();this.createStoreUserOrgInfo();}// 創(chuàng)建系統(tǒng)配置表及索引private createConfigInfo(): void {let store = this.db.createObjectStore('ConfigInfo',{keyPath: 'key'});}// 創(chuàng)建用戶(hù)表及索引private createStoreUserInfo(): void {let store = this.db.createObjectStore('UserInfo',{keyPath: 'userId'});}// 創(chuàng)建組織表及索引private createStoreOrgInfo(): void {let store = this.db.createObjectStore('OrgInfo',{keyPath: 'orgId'});store.createIndex('parentOrgIdIndex',['parentOrgId', 'displayOrder'],{unique: false});}// 創(chuàng)建組織表及索引private createStoreUserOrgInfo(): void {let store = this.db.createObjectStore('UserOrgInfo',// S zhuruifei 2017-08-14 通訊錄數(shù)據(jù)結(jié)構(gòu)變更{keyPath: 'personRoleId'}// E zhuruifei 2017-08-14 通訊錄數(shù)據(jù)結(jié)構(gòu)變更);store.createIndex('orgIdIndex','orgId',{unique: false});}// 創(chuàng)建稿件瀏覽記錄表private createViewDB(): void{let store = this.db.createObjectStore('viewedDoc',{keyPath: 'docId'});store.createIndex('viewedDoc','docId',{unique: true});}// 批量查詢(xún)稿件瀏覽信息judgeIfWatched(storeName: string,data: any[]):Promise<any>{if (!data || data.length === 0) {return Promise.resolve();}return Promise.all(data.map((data)=> {return this.selectByKey(storeName,data.docId).then((res)=> {if(res&&res.docId) {data.viewed = "1";}return Promise.resolve();})})).catch((error) => {console.error(error);return Promise.reject(error);});}// 清除30天前的數(shù)據(jù)cleanViewDB(){this.open().then(()=>{// 通過(guò)IDBDatabase得到IDBTransactionlet transaction = this.db.transaction('viewedDoc', 'readonly');// 通過(guò)IDBTransaction得到IDBObjectStorelet objectStore = transaction.objectStore("viewedDoc");// 打開(kāi)游標(biāo),遍歷customers中所有數(shù)據(jù)objectStore.openCursor().onsuccess = function(event) {let cursor = event.target.result;if (cursor) {let key = cursor.key;let rowData = cursor.value;var time1 = new Date(rowData.lastViewTime);var time2 = new Date();if(Math.abs(time2.getTime() - time1.getTime())>2592000000){// 清除三十天前的數(shù)據(jù)this.workdelete('viewedDoc',cursor.key);}cursor.continue();}}.bind(this);})} }感謝您看到了這里,這里是結(jié)尾。如果對(duì)您有幫助,我深感欣慰。自己給自己做廣告,不犯法吧?歡迎關(guān)注WeChat公眾號(hào)
**微信公眾號(hào): 耐撕程序員
有資源
有想法
有技術(shù)貼
隨手掃一掃
不吃虧不上當(dāng)
大家一起天天向上
歡迎掃碼關(guān)注相互交流**
總結(jié)
以上是生活随笔為你收集整理的IndexedDB使用(基本函数封到Angular2的service里)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dnf界武器怎么获得 地下城与勇士
- 下一篇: 洪恩识字如何取消自动续费