Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dynamically create object stores in existing databases with indexed db

Tags:

indexeddb

I am using idb to perform indexed db operations. We are implementing a caching system. I need to create object stores dynamically . How can I add object stores in an existin database without having to know the version? Because apparently an object store can only be created in the upgrade callback in case the version is increased. So we don't know on before hand how many object stores there are going to be created.

like image 420
stephan.peters Avatar asked Jan 21 '26 03:01

stephan.peters


1 Answers

Get the version of a database without increment it, it is something like this, I forget the exact syntax:

function getDatabaseVersion(name) {
  return new Promise((resolve, reject) => {
    const request = indexedDB.open(name);
    request.onsuccess = event => {
     const database = event.target.result;
     database.close();
     resolve(event.version);
    };
    request.onerror = event => reject(event.target.error);
    request.onblocked = event => reject(new BlockedIndefinitelyError());
  });
}

class BlockedIndefinitelyError extends Error {
  constructor(message = 'Database open was blocked') {
    super(message);
  }
}

// version is optional, leave as undefined if not upgrading
function open(name, version, upgradeneeded) {
  return new Promise((resolve, reject) => {
    const request = indexedDB.open(name, version);
    request.onupgradeneeded = upgradeneeded;
    request.onerror = event => reject(event.target.error);
    request.onsuccess = event => resolve(event.target.result);
    request.onblocked = event => reject(new BlockedIndefinitelyError());
  });
}

async function dothings() {
  const name = 'mydb';
  const version = await getDatabaseVersion(name);

  if(conditionDecidingWhetherToCreateNewTablesIsTrue) {
    const database = await open(name, version + 1, event => {
      const database = event.target.result;
      for (const store of storesToCreate) {
        database.createObjectStore(store, store.options);
      }
    });
    database.close();
  }
}
like image 119
Josh Avatar answered Jan 23 '26 06:01

Josh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!