私的メモ from 2018
メモ的な何かとか・・・・ 2021-11-25 13:35:13
IndexedDBを使おうかと思った、ただ意図的に消さないとずっと残るらしい
IndexedDBを使う
const __debug__ = true;
/**
* indexedDB操作クラス
*/
class indexDBAccess {
/**
* 初期化
*
* string dbName DB名
* string storeName store名
* int maxDataCount 保存データ数(これを過ぎると古いものから消す)
*/
constructor(dbName = "indexDbAccess", storeName = 'datas', maxDataCount=1000){
let self = this;
if(!indexedDB) {
self.debuglog("indexedDBが使えない");
return false;
}
self.dbName = dbName;
self.storeName = storeName;
self.logMax = maxDataCount;
self.dbVersion = 1;
let openReq = indexedDB.open(self.dbName);
// DBがある場合はバージョンを取得する
openReq.onsuccess = function(event) {
let db = event.target.result;
self.dbVersion = db.version;
self.debuglog("dbopen success:" + self.dbVersion);
db.close();
}
// DBが無い場合は作成
openReq.onerror = function(event) {
self.debuglog("db none");
self.createDB();
}
}
/**
* DBとストア作成
*/
createDB() {
let self = this;
self.debuglog("create dbVersion="+self.dbVersion);
let openReq = indexedDB.open(self.dbName,self.dbVersion);
// 新規作成時
openReq.onupgradeneeded = function(event){
let db = event.target.result;
self.dbVersion = db.version;
self.debuglog("created db upgrade dbVersion="+self.dbVersion);
let store = db.createObjectStore(self.storeName, {keyPath : 'id', autoIncrement: true});
db.close();
}
// 既に該当のバージョンがある場合
openReq.onsuccess = function(event){
let db = event.target.result;
self.dbVersion = db.version;
self.debuglog("created db dbVersion="+self.dbVersion);
db.close();
}
// バージョンが上がっている場合エラーになるのでバージョン番号のみ取得する、
openReq.onerror = function(event) {
self.debuglog("dbVersion invalid");
let openReq = indexedDB.open(self.dbName);
openReq.onsuccess = function(event){
let db = event.target.result;
self.dbVersion = db.version;
self.debuglog("created db dbVersion="+self.dbVersion);
db.close();
}
}
}
/**
* 保存データ数の変更
*
* int maxDataCount 保存データ数
*/
setMaxCount(maxDataCount=10) {
this.logMax = maxDataCount;
}
/**
* DBの削除
*/
drop () {
if(!indexedDB) {
return false;
}
let self = this;
let dbName = self.dbName;
let storeName = self.storeName;
self.debuglog("delete count dbVersion="+self.dbVersion);
self.dbVersion++;
self.debuglog("delete counted dbVersion="+self.dbVersion);
indexedDB.deleteDatabase(dbName);
}
/**
* 追加
*/
add(val) {
let self = this;
self.put(val);
}
/**
* 更新
*/
put(val, key=null) {
if(!indexedDB) {
return false;
}
let self = this;
let dbName = self.dbName;
let storeName = self.storeName;
self.debuglog("dbName=" + dbName + " dbViersion=" + self.dbVersion + " write value:" + val);
let openReq = indexedDB.open(dbName,self.dbVersion);
openReq.onupgradeneeded = function(event){
let db = event.target.result;
self.dbVersion = db.version;
self.debuglog('write create object store:' + self.dbVersion);
let store = db.createObjectStore(self.storeName, {keyPath : 'id', autoIncrement: true});
}
openReq.onsuccess = function(event){
let db = event.target.result;
self.dbVersion = db.version;
self.debuglog("write db open dbVersion="+self.dbVersion + ":" + db.objectStoreNames.length);
if (db.objectStoreNames.length<1){
self.drop();
self.createDB();
return;
}
let transaction = db.transaction([storeName], "readwrite");
let store = transaction.objectStore(storeName);
if (key === null) {
let result = store.add({value: val});
self.debuglog("add value");
result.onsuccess = function(event){
let maxkey = event.target.result;
self.debuglog("write add dbVersion="+self.dbVersion);
if (maxkey>self.logMax) {
let keyRangeValue = IDBKeyRange.upperBound(maxkey-self.logMax, false);
store.delete(keyRangeValue);
}
}
}
else{
let result = store.put({id: key, value: val});
result.onsuccess = function(event) {
let db = event.target.result;
self.dbVersion = db.version;
self.debuglog("put value key=" + key + " dbVersion=" + self.dbVersion);
}
}
db.close();
}
}
/**
* 取得
*/
dataGet() {
if(!indexedDB) {
return false;
}
let self = this;
let resultData = new Array();
const promise = new Promise((resolve, reject) => {
let dbName = self.dbName;
let storeName = self.storeName;
let openReq = indexedDB.open(dbName,self.dbVersion);
openReq.onupgradeneeded = function(event){
let db = event.target.result;
self.dbVersion = db.version;
self.debuglog('dataGet create object store:' + self.dbVersion);
let store = db.createObjectStore(self.storeName, {keyPath : 'id', autoIncrement: true});
}
openReq.onsuccess = function(event){
let db = event.target.result;
self.dbVersion = db.version;
self.debuglog("dataGet dbVersion="+self.dbVersion);
if (db.objectStoreNames.length<1){
db.close();
self.drop();
self.createDB();
return;
}
let transaction = db.transaction([storeName], "readwrite");
let datas = transaction.objectStore(storeName);
datas.openCursor().onsuccess = function (event) {
let cursor = event.target.result;
if (cursor) {
let cv = cursor.value;
resultData.push(cv);
cursor.continue();
}
}
db.close();
}
});
return resultData;
}
debuglog(msg) {
if (__debug__) {
console.log(msg);
}
}
}
let db = new indexDBAccess();
function getdata() {
let result = db.dataGet();
console.log(result);
}
意図的に消さないと消えない。javascript,indexeddb
2019-03-11 15:07:52
2019-03-12 14:12:33