Last active
September 25, 2017 10:55
-
-
Save uesteibar/bb64b2758d806944aee5 to your computer and use it in GitHub Desktop.
A basic tasks crud with indexedDB for angular.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Create the database service to manage data storage. | |
//To learn about the $q object and angularjs promises: | |
//http://andyshora.com/promises-angularjs-explained-as-cartoon.html | |
myApp.factory('database', function ($window, $q) { | |
var indexedDB = $window.indexedDB; | |
var db = null; | |
var lastIndexTask = 0; | |
var lastIndexProject = 1; | |
var open = function () { | |
var deferred = $q.defer(); | |
var version = 5; | |
var request = indexedDB.open("taskData", version); | |
request.onupgradeneeded = function (e) { | |
db = e.target.result; | |
e.target.transaction.onerror = indexedDB.onerror; | |
//TASKS STORE | |
if (db.objectStoreNames.contains("task")) { | |
db.deleteObjectStore("task"); | |
} | |
var store = db.createObjectStore("task", { | |
keyPath: "id" | |
}); | |
//TAGS STORE | |
if (db.objectStoreNames.contains("tag")) { | |
db.deleteObjectStore("tag"); | |
} | |
var store = db.createObjectStore("tag", { | |
keyPath: "id" | |
}); | |
//TASKS-TAGS RELATIONSHIP STORE | |
if (db.objectStoreNames.contains("task_x_tag")) { | |
db.deleteObjectStore("task_x_tag"); | |
} | |
var store = db.createObjectStore("task_x_tag", { | |
keyPath: "id" | |
}); | |
//TASKS-TAGS RELATIONSHIP STORE | |
if (db.objectStoreNames.contains("user")) { | |
db.deleteObjectStore("user"); | |
} | |
var store = db.createObjectStore("user", { | |
keyPath: "id" | |
}); | |
}; | |
request.onsuccess = function (e) { | |
db = e.target.result; | |
deferred.resolve(); | |
}; | |
request.onerror = function () { | |
deferred.reject("An error occurs opening database"); | |
}; | |
return deferred.promise; | |
}; | |
// TASKS CRUD // | |
var getTasks = function () { | |
var deferred = $q.defer(); | |
if (db === null) { | |
deferred.reject("IndexDB is not opened yet!"); | |
} else { | |
var trans = db.transaction(["task"], "readwrite"); | |
var store = trans.objectStore("task"); | |
var tasks = []; | |
// Get everything in the store; | |
var keyRange = IDBKeyRange.lowerBound(0); | |
var cursorRequest = store.openCursor(keyRange); | |
cursorRequest.onsuccess = function (e) { | |
var result = e.target.result; | |
if (result === null || result === undefined) { | |
deferred.resolve(tasks); | |
} else { | |
tasks.push(result.value); | |
if (result.value.id > lastIndexTask) { | |
lastIndexTask = result.value.id; | |
} | |
result.continue(); | |
} | |
}; | |
cursorRequest.onerror = function (e) { | |
console.log(e.value); | |
deferred.reject("Something went wrong!!!"); | |
}; | |
} | |
return deferred.promise; | |
}; | |
var deleteTask = function (id) { | |
var deferred = $q.defer(); | |
if (db === null) { | |
deferred.reject("IndexDB is not opened yet!"); | |
} else { | |
var trans = db.transaction(["task"], "readwrite"); | |
var store = trans.objectStore("task"); | |
var request = store.delete(id); | |
request.onsuccess = function (e) { | |
deferred.resolve(); | |
}; | |
request.onerror = function (e) { | |
console.log(e.value); | |
deferred.reject("Task item couldn't be deleted"); | |
}; | |
} | |
return deferred.promise; | |
}; | |
var updateTask = function (id, key, value) { | |
var deferred = $q.defer(); | |
if (db === null) { | |
deferred.reject("IndexDB is not opened yet!"); | |
} else { | |
var trans = db.transaction(["task"], "readwrite"); | |
var store = trans.objectStore("task"); | |
var getrequest = store.get(id); | |
getrequest.onsuccess = function (e) { | |
getrequest.result[key] = value; | |
var request = store.put(getrequest.result); | |
request.onsuccess = function (e) { | |
deferred.resolve(); | |
}; | |
request.onerror = function (e) { | |
console.log(e.value); | |
deferred.reject("Task item couldn't be updated!"); | |
}; | |
} | |
} | |
return deferred.promise; | |
}; | |
var saveTask = function (task) { | |
var deferred = $q.defer(); | |
if (db === null) { | |
deferred.reject("IndexDB is not opened yet!"); | |
} else { | |
var trans = db.transaction(["task"], "readwrite"); | |
var store = trans.objectStore("task"); | |
lastIndexTask++; | |
task.id = lastIndexTask; | |
task.status = 0; | |
var request = store.put(task); | |
request.onsuccess = function (e) { | |
deferred.resolve(); | |
}; | |
request.onerror = function (e) { | |
console.log(e.value); | |
deferred.reject("Task item couldn't be added!"); | |
}; | |
} | |
return deferred.promise; | |
}; | |
// END OF TASKS CRUD // | |
return { | |
open: open, | |
getTasks: getTasks, | |
saveTask: saveTask, | |
deleteTask: deleteTask, | |
updateTask: updateTask, | |
}; | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
{status: 2, value: "IndexDB is not opened yet!"} ı had this error with angular js