日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IndexedDB使用(基本函数封到Angular2的service里)

發布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IndexedDB使用(基本函数封到Angular2的service里) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

IndexedDB使用

使用場景

  • 具體使用場景:

存儲用戶瀏覽記錄。

  • 適合的使用場景:
  • 處于安全性考慮,數據不能存儲到服務器端。
  • 數據為結構性數據或者數據量較大,不適合使用cookies。
  • 希望數據不隨著客戶清理緩存而刪除。此時我們一定一定要設計好清理瀏覽器端數據的時機。
  • 相關站點

  • MDN文檔(中英) 訪問
  • IBM develoerWorks(中文) 訪問
  • 這個可能是最權威的了吧,W3C(英文)訪問
  • ps:那么多好的資料了,為什么還寫博客?

  • 做筆記;
  • 我用的Angular2,語法糖是ES6的啊。
  • 代碼段

    代碼段來自項目,當然是底層的與項目無關。這部分代碼大部分是已有的,來自一個已經離開項目的同事,我寫了一部分。在此我只是記錄下而已。

    // 項目使用的是Angular2,這是一個service。有關Angular2的寫法我不做說明。 import { Injectable } from '@angular/core';@Injectable() export class WorkIndexedDBService {// 聲明一些屬性,name:數據庫名,version:數據庫版本// name和version發生變化,瀏覽器就會重新建一個新的indexedDBprivate name: string = 'test-docView';private version: number = 1;private db: any = null;constructor() { }// 打開并創建數據庫public open(): Promise<any> {return new Promise<any>((resolve, reject) => {// 打開indexedDBlet req = indexedDB.open(this.name, this.version);// 打開DB成功后的回調req.onsuccess = function(event) {this.db = event.target.result;resolve();}.bind(this); // 此處說明.bind(this),是為了把當前類的屬性和方法傳入req.onsuccess的這個function里。即:.bind(this)的this是指本類WorkIndexedDBService// 打開DB失敗后的回調req.onerror = reject;// 打開新的數據庫時,會回調此函數,改變name和version均會建立新的DB,所以都會發生此回調。req.onupgradeneeded = function(event) {// 如果版本升級要記得刪除舊的數據庫表再建立新的。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]);}}// 創建數據庫表this.createViewDB();}.bind(this);});}// 關閉數據庫public close(): void {this.db.close();}// 刪除數據庫public deleteDB(): Promise<any> {return new Promise<any>((resolve, reject) => {// 先關閉連接再刪this.close();let req = indexedDB.deleteDatabase(this.name);req.onsuccess = function(event) {this.db = null;resolve();}.bind(this);req.onerror = reject;});}// 添加數據// 注意:使用事務來做操作比較快。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;});}// 批量添加數據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 + '表數據失敗', error);return Promise.reject(error);});}// 刪除數據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;});}// 清楚全部數據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);}));}// 清空數據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;});}// 更新數據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;});}// 根據Key取得數據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;});}// 根據索引取得數據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;});}// 批量合并數據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 + '表數據失敗', error);return Promise.reject(error);});}// 數據庫初始化處理private createDB(): void {this.createConfigInfo();this.createStoreUserInfo();this.createStoreOrgInfo();this.createStoreUserOrgInfo();}// 創建系統配置表及索引private createConfigInfo(): void {let store = this.db.createObjectStore('ConfigInfo',{keyPath: 'key'});}// 創建用戶表及索引private createStoreUserInfo(): void {let store = this.db.createObjectStore('UserInfo',{keyPath: 'userId'});}// 創建組織表及索引private createStoreOrgInfo(): void {let store = this.db.createObjectStore('OrgInfo',{keyPath: 'orgId'});store.createIndex('parentOrgIdIndex',['parentOrgId', 'displayOrder'],{unique: false});}// 創建組織表及索引private createStoreUserOrgInfo(): void {let store = this.db.createObjectStore('UserOrgInfo',// S zhuruifei 2017-08-14 通訊錄數據結構變更{keyPath: 'personRoleId'}// E zhuruifei 2017-08-14 通訊錄數據結構變更);store.createIndex('orgIdIndex','orgId',{unique: false});}// 創建稿件瀏覽記錄表private createViewDB(): void{let store = this.db.createObjectStore('viewedDoc',{keyPath: 'docId'});store.createIndex('viewedDoc','docId',{unique: true});}// 批量查詢稿件瀏覽信息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天前的數據cleanViewDB(){this.open().then(()=>{// 通過IDBDatabase得到IDBTransactionlet transaction = this.db.transaction('viewedDoc', 'readonly');// 通過IDBTransaction得到IDBObjectStorelet objectStore = transaction.objectStore("viewedDoc");// 打開游標,遍歷customers中所有數據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){// 清除三十天前的數據this.workdelete('viewedDoc',cursor.key);}cursor.continue();}}.bind(this);})} }

    感謝您看到了這里,這里是結尾。如果對您有幫助,我深感欣慰。自己給自己做廣告,不犯法吧?歡迎關注WeChat公眾號

    **微信公眾號: 耐撕程序員

    有資源

    有想法

    有技術貼

    隨手掃一掃

    不吃虧不上當

    大家一起天天向上

    歡迎掃碼關注相互交流**

    總結

    以上是生活随笔為你收集整理的IndexedDB使用(基本函数封到Angular2的service里)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 99国产精品人妻噜啊噜 | 国产成人一区 | 18岁成年人网站 | 亚洲av无码一区二区三区在线观看 | 成人91网站 | 激情综合丁香五月 | 中文字幕第7页 | 国产孕交 | 欧美高h视频 | 亚洲国产精品99 | 日本在线免费视频 | 亚洲人成久久 | 淫五月天 | 午夜一区二区三区在线 | 91在线高清视频 | 毛片黄色一级 | 中文字幕视频一区二区 | 妺妺窝人体色777777 | 蜜桃传媒一区二区亚洲 | 免费在线观看av网站 | 成人av网址在线 | 欧洲性生活视频 | 日本大乳奶做爰 | 中文字幕在线观看亚洲 | 18禁网站免费无遮挡无码中文 | 天天看a | 日韩少妇内射免费播放18禁裸乳 | 久久网国产 | 成年人av在线播放 | 黄色片网站在线播放 | 日韩伦理视频 | 国产又粗又大又硬 | 免费中文字幕日韩 | 精品国产91乱码一区二区三区 | 黑白配高清国语在线观看 | 香蕉私人影院 | 国语对白永久免费 | 正在播放木下凛凛xv99 | 亚洲一区在线免费观看 | 免费在线黄色av | 久久天天躁狠狠躁夜夜躁2014 | 熊猫电影yy8y全部免费观看 | 久草影视在线观看 | 亚洲xx站 | 精品中文一区二区三区 | 久久深夜视频 | 色综合网址 | 中文字幕+乱码+中文乱码www | 婷婷国产一区二区三区 | 一区二区三区网站 | 国产免费一区二区视频 | 中文字幕乱码人妻无码久久95 | 厨房性猛交hd | 丰满少妇中文字幕 | 亚洲精品久久久久久久久 | 成人在线免费观看视频 | 久久久久久久久久久久久久久久久久久久 | 一品毛片 | 欧美黄色网络 | 亚洲精品在线观看免费 | 午夜精品福利在线观看 | 激情毛片视频 | 天堂av免费在线 | 国产亚洲精品久久久久久久 | 国产九九九 | 琪琪色在线观看 | 亚洲国产欧美在线人成 | 亚洲二区一区 | 国产一区二区免费 | 国产成人精品综合在线观看 | 伊人网综合网 | 国产日韩精品电影 | 久久久夜| 女儿的朋友5中汉字晋通话 欧美成人免费高清视频 | 男女毛片视频 | 日本黄色电影网址 | 欧美日韩在线播放三区四区 | 三级理论电影 | 老熟妇仑乱一区二区av | 99热在线观看免费精品 | 欧美激情免费看 | 亚色视频在线观看 | 色黄啪啪网 | 亚洲精品综合网 | 国产成人精品一区二区三区福利 | 免费看三级黄色片 | 中文字幕亚洲欧美日韩 | 精品一区二区三区四区五区 | 亚洲丝袜在线观看 | 久章草在线观看 | 咪咪av| 性久久久久 | 聚色屋 | 性高潮久久久久久久久久 | 久久精品操 | 国产区123| 中文字幕在线天堂 | 秋霞国产午夜精品免费视频 | 日韩一区二区久久 |