0

I've created a set of JSON data that gets passed into IndexedDB during the upgrade event. It creates a very nice IndexedDB database with seemingly no problems. The problem is when you upgrade the database from version 1 to 2 it overwrites all existing data since it just loops through the JSON and applies it.

There must be some way in the upgrade to prevent a new database item that doesn't have a unique key from writing anything. How would I do this? As the following just overwrites current data.

objectStore = event.currentTarget.transaction.objectStore('player');
objectStore.put({ key: 'non unique, but I replace my twin\'s data anyway', data: value });

Thanks in advance for the help, searched everything and can't find a solution to this problem.

EDIT 8/24/2012

As per Kristof's recommendation of using get to check information, I did a bit of digging and research. After finding the answer I decided to write some psuedo code to help you out.

// Create the get request inside your upgrade
var tableData = event.currentTarget.transaction.objectStore('your table name');
var getData = tableStore.get('your key');

// Run the get request
getData.onsuccess = function (e) {
    var result = e.target.result;

    // Immediately exit if the current result is not undefined
    if (result !== undefined) {
        return;
    }

    // Note, you may or may not need a closure to write data in the callback
    // See here for more info on closures in events http://stackoverflow.com/questions/3495679/passing-parameters-in-javascript-onclick-event#answer-3495722
    tableStore.add('data to add');
};
Josh
  • 17,834
  • 7
  • 50
  • 68
Ash Blue
  • 5,344
  • 5
  • 30
  • 36

1 Answers1

2

Overwriting of data can only happen if it finds a key that already exist in the database. If it doesn't find the key, it will be just added.

If you want to prevent that this data gets inserted for a second time or update there are some solutions:

  • Before putting the data, check if anything wit that key exists (get method)
  • Use the add method instead of the put. (this will result in an error when a key already exists. Not very nice)
  • Check if the old version of the database is 0 or nothing and only then run the insert.
Kristof Degrave
  • 4,142
  • 22
  • 32
  • Tried all the options except the get. So I should do get.success = 'don't write this'; get.error = 'do write this'; I'm guessing that would fire a nasty error if it already doesn't exist though wouldn't it? – Ash Blue Aug 23 '12 at 06:08
  • Well do the following get.success = function(e){ if(!get.result){ //insert }}. This should work. I would prefer to do my last option. It is possible the version of the db can be "" too... – Kristof Degrave Aug 23 '12 at 06:13
  • If I check the database and its 0 or nothing, I can only upgrade it one time. I need this to be upgrade-able for possibly several versions. Going to take a swing at using get to see if they key exists something this weekend. – Ash Blue Aug 24 '12 at 05:58
  • In that case you need to open the db in a higher version or in chrome use the setversion method – Kristof Degrave Sep 02 '12 at 12:24