Skip to content

Instantly share code, notes, and snippets.

@uesteibar
Last active September 25, 2017 10:55
Show Gist options
  • Save uesteibar/bb64b2758d806944aee5 to your computer and use it in GitHub Desktop.
Save uesteibar/bb64b2758d806944aee5 to your computer and use it in GitHub Desktop.
A basic tasks crud with indexedDB for angular.js
//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,
};
});
@diloabininyeri
Copy link

{status: 2, value: "IndexDB is not opened yet!"} ı had this error with angular js

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment