Reputation: 5602
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');
};
Upvotes: 0
Views: 1091
Reputation: 4180
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:
Upvotes: 2