最近在做BI项目,需要用到IndexedDB来做Key-Value类型的表 来本地缓存GIS渲染需要海量数据。(不得不吐槽YD公司网络部搭了那辣鸡内网环境)
做法和传统用Redis做缓存思路一样:Web本地DB有则区DB没有则请求WebAPI
(尼玛蛋,为什么 LocalStore只支持10M!~)
class DataPak {
public CodeID: number = 1;
public Data: any;
public Message: string = '';
public Description: string = '成功';
constructor(Data: any = null, CodeID: number = 1, Description: string = '成功', Msg: string = '') {
this.CodeID = CodeID;
this.Data = Data;
this.Message = Msg;
this.Description = Description;
};
};
class DB_Instance {
private DB_Cache: string = 'DB_Cache';
private DB_VERSION: number = 1;
private STORE_GISCache: string = 'Store_GISCache';
private db_ins: any;
private DB: IDBFactory;
private request: IDBOpenDBRequest;
//初始化函数
constructor() {
let _this = this;
this.DB = window.indexedDB;
this.request = this.DB.open(this.DB_Cache, this.DB_VERSION);
this.request.onsuccess = function (ev: Event) {
console.log('Successful request for IndexedDB.');
_this.db_ins = _this.request.result;
var transaction = _this.db_ins.transaction(_this.STORE_GISCache, 'readwrite');
transaction.oncomplete = function () {
console.log('Transaction completed successfully.');
}
transaction.onerror = function (error) {
console.log('An error occurred during the transaction: ' + error);
}
};
this.request.onupgradeneeded = function (this: IDBRequest, ev: Event) {
_this.db_ins = this.result;
//创建 GIS 表
let Store_GISCache = _this.db_ins.createObjectStore(
_this.STORE_GISCache,
{
keyPath: 'KeyID',
autoIncrement: 'true' //自动自增加
}
);
//索引 A
Store_GISCache.createIndex(
'by_keyid',
'KeyID',
{
'unique': true,
}
);
//索引 B
Store_GISCache.createIndex(
'by_token',
'Token',
{
'unique': true,
}
);
console.log('The database has been created/updated.');
};
this.request.onerror = function (ev: Event) {
console.log('错误');
}
console.log('初始化成功');
};
//暴露 GISCache表实例。
getStore_GISCache(): IDBObjectStore {
let transaction = this.db_ins.transaction(this.STORE_GISCache, 'readwrite');
let store: IDBObjectStore = transaction.objectStore(this.STORE_GISCache);
return store;
}
//Key-Value Query
query_GISCache(token: string, func_onsuccess: any, func_onerror: any = null) {
let transaction = this.db_ins.transaction(this.STORE_GISCache, 'readwrite');
let store = transaction.objectStore(this.STORE_GISCache);
//let idIndex = store.index('by_keyid');
let TokenIndex = store.index('by_token');
let temp_request = TokenIndex.get(token);
transaction.onsuccess = function () {
let ret_pak = new DataPak(temp_request.result);
func_onsuccess(ret_pak);
};
transaction.oncomplete = function () {
let ret_pak = new DataPak(temp_request.result);
func_onsuccess(ret_pak);
};
transaction.onerror = function (ev) {
if (func_onerror != null) {
let ret_pak = new DataPak(null, 0, '错误');
func_onerror(ret_pak);
}
};
};
//Query List;
queryList_GISCache(WhereFunc: any, func_onsuccess: any, func_onerror: any = null) {
let transaction = this.db_ins.transaction(this.STORE_GISCache, 'readwrite');
let store = transaction.objectStore(this.STORE_GISCache);
let ret_pak = new DataPak([], 1, '成功');
store.openCursor().onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
let Current_Value = cursor.value;
let bEnable = WhereFunc(Current_Value);
if (bEnable) {
ret_pak.Data.push(Current_Value);
}
else {
ret_pak.Data.push(Current_Value);
}
cursor.continue();
}
else {
func_onsuccess(ret_pak);
}
};
store.openCursor().onerror = function (ev) {
if (func_onerror != null) {
ret_pak.CodeID = 0;
ret_pak.Description = '错误';
func_onerror(ret_pak);
}
};
};
//Insert
insert_GISCache(val, func_onsuccess: any = null, func_onerror: any = null) {
let transaction = this.db_ins.transaction(this.STORE_GISCache, 'readwrite');
transaction.onsuccess = function () {
if (func_onsuccess != null) {
let ret_pak = new DataPak();
func_onsuccess(ret_pak);
}
};
transaction.oncomplete = function () {
//console.log(this);
if (func_onsuccess != null) {
let ret_pak = new DataPak();
func_onsuccess(ret_pak);
}
};
transaction.onerror = function (ev) {
if (func_onerror != null) {
let ret_pak = new DataPak(null, 0, '错误');
func_onerror(ret_pak);
}
};
let store = transaction.objectStore(this.STORE_GISCache);
store.put(val);
};
//删除
delete_GISCache(token: string, func_onsuccess: any = null, func_onerror: any = null) {
};
//删除
deleteList_GISCache() {
}
};
var db_Instance = new DB_Instance();