本地存储IndexedDB 增删改查

本文详细介绍了一种使用IndexDB存储大量数据的方法,通过具体代码示例,涵盖了IndexDB的基本操作,如增删改查、主键查询、索引查询及模糊查询,为开发者提供了一个实用的IndexDB应用参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到一个项目需要存储大量的数据,对比了一下各种存储,indexDB是最符合要求的,其特点就不列出来了,还是直接上代码吧。。indexDB的增删改查基本涵盖了,查询有根据主键查询,自己另外设置了索引,所以有相应的索引查询,然后另外写了一个模糊查询。有错误欢迎指正~
本文参考了阮一峰老师的indexDB的入门教程

let myDB = {
  name: 'myDB',
  version: 1,
  db: null,
  ojstore: {
    name: 'list',//存储空间表的名字
    keypath: 'id',//主键
    indexName: 'name',//索引名称
  }
};

let IndexDB = {
  indexedDB: window.indexedDB || window.webkitindexedDB,
  IDBKeyRange: window.IDBKeyRange || window.webkitIDBKeyRange,//键范围
  
  openDB: function (dbname, dbversion, callback) {
    //建立或打开数据库,建立对象存储空间(ObjectStore)
    let self = this;
    let version = dbversion || 1;
    let request = self.indexedDB.open(dbname, version);
    request.onerror = function (e) {
      console.log(e.currentTarget.error.message);
    };
    request.onsuccess = function (e) {
      myDB.db = e.target.result;
      console.log('成功建立并打开数据库:' + myDB.name + ' version' + dbversion);
    };
    request.onupgradeneeded = function (e) {
      let db = e.target.result, transaction = e.target.transaction, store;
      if (!db.objectStoreNames.contains(myDB.ojstore.name)) {
        //没有该对象空间时创建该对象空间
        store = db.createObjectStore(myDB.ojstore.name, {keyPath: myDB.ojstore.keypath});
        console.log('成功建立对象存储空间:' + myDB.ojstore.name);
        store.createIndex(myDB.ojstore.indexName, myDB.ojstore.indexName, {unique: false});
      }
    }
  },
  
  deleteDB: function (dbname) {
    //删除数据库
    let self = this;
    self.indexedDB.deleteDatabase(dbname);
    console.log(dbname + '数据库已删除')
  },
  
  closeDB: function (db) {
    //关闭数据库
    db.close();
    console.log('数据库已关闭')
  },
  
  addData: function (db, storename, data) {
    //添加数据,重复添加会报错
    let store = store = db.transaction(storename, 'readwrite').objectStore(storename), request;
    for (let i = 0; i < data.length; i++) {
      request = store.add(data[i]);
      request.onerror = function () {
        console.error('add添加数据库中已有该数据')
      };
      request.onsuccess = function () {
        console.log('add添加数据已存入数据库')
      };
    }
  },
  
  putData: function (db, storename, data) {
    //添加数据,重复添加会更新原有数据
    let store = store = db.transaction(storename, 'readwrite').objectStore(storename), request;
    for (let i = 0; i < data.length; i++) {
      request = store.put(data[i]);
      request.onerror = function () {
        console.error('put添加数据库中已有该数据')
      };
      request.onsuccess = function () {
        console.log('put添加数据已存入数据库')
      };
    }
  },
  
  getDataByKey: function (db, storename, key) {
    //根据存储空间的键找到对应数据
    let keyData;
    let store = db.transaction(storename, 'readwrite').objectStore(storename);
    let request = store.get(key);
    request.onerror = function () {
      console.error('getDataByKey error');
    };
    request.onsuccess = function (e) {
      keyData = e.target.result;
      console.log('查找数据成功')
    };
    return keyData;
  },
  
  getDataByIndex: function (db, storename, indexName) {
    //根据索引找到对应数据
    let keyData;
    let store = db.transaction(storename, 'readwrite').objectStore(storename);
    let request = store.index(myDB.ojstore.indexName).get(indexName);
    request.onerror = function () {
      console.error('getDataByIndex error');
    };
    request.onsuccess = function (e) {
      keyData = e.target.result;
      console.log('根据索引查找数据成功')
      console.log(keyData);
    };
  },
  
  getAllData: function (db, storename) {
    //获取全部数据
    let all = []
    let store = db.transaction(storename, 'readwrite').objectStore(storename);
    let request = store.openCursor();
    request.onerror = function () {
      console.error('getDataByKey error');
    };
    request.onsuccess = function (e) {
      let result = e.target.result;
      if (result) {
        // console.log(result.value);
        all.push(result.value);
        result.continue();
      } else {
        console.log('已获取全部数据!')
      }
    };
  },
  
  getSearchData: function (db, storename, condition) {
    //根据条件获取数据(模糊查询)
    let all = []
    let store = db.transaction(storename, 'readwrite').objectStore(storename);
    let request = store.openCursor();
    request.onerror = function () {
      console.error('getDataByKey error');
    };
    request.onsuccess = function (e) {
      let result = e.target.result;
      if (result) {
        if (JSON.stringify(result.value).indexOf(condition) > 0) {
          all.push(result.value);
        }
        result.continue();
      } else {
        console.log('根据条件已获取全部数据!')
        console.log(all);
      }
    };
  },
  
  deleteData: function (db, storename, key) {
    //删除某一条记录
    let store = store = db.transaction(storename, 'readwrite').objectStore(storename);
    store.delete(key)
    console.log('已删除存储空间' + storename + '中' + key + '记录');
  },
  clearData: function (db, storename) {
    //删除存储空间全部记录
    let store = db.transaction(storename, 'readwrite').objectStore(storename);
    store.clear();
    console.log('已删除存储空间' + storename + '全部记录');
  }
}

let list = [{name:'test1',age:'12'},
  {name:'test2',age:'13'},
  {name:'test3',age:'14'}];

IndexDB.openDB(myDB.name, myDB.version);
setTimeout(function () {
  IndexDB.addData(myDB.db, myDB.ojstore.name, list);//添加数据
  // IndexDB.addData(myDB.db, myDB.ojstore.name, list);//add重复添加
  // IndexDB.putData(myDB.db, myDB.ojstore.name, list);//put重复添加
 //  IndexDB.getDataByKey(myDB.db, myDB.ojstore.name, 'test1');//根据主键获取数据
 //  IndexDB.getAllData(myDB.db, myDB.ojstore.name);//获取所有数据
 // IndexDB.getDataByIndex(myDB.db, myDB.ojstore.name,'test');//模糊查询数据
  // IndexDB.deleteData(myDB.db,myDB.ojstore.name,'test1');//根据主键删除数据
  // IndexDB.clearData(myDB.db,myDB.ojstore.name);//删除全部数据
  // IndexDB.closeDB(myDB.db);//关闭数据库
  // IndexDB.deleteDB(myDB.name);//删除数据库
}, 800);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值