Having faced numerous issues with SQLite, I decided to explore LokiJS as an alternative solution for my Ionic app. However, even with LokiJS, I encountered challenges.
Currently, I have a simple code that should function smoothly:
.controller('ProjectsController', ['$scope', '$state', '$ionicPlatform', function($scope, $state, $ionicPlatform) {
var pcVm = this;
var db;
var projects1;
$ionicPlatform.ready(function(){
var idbAdapter = new LokiIndexedAdapter('loki');
db = new loki('lkr-v4', {
autoload: true,
autoloadCallback : getAllProjects,
autosave: true,
autosaveInterval: 10000,
adapter: idbAdapter
});
function getAllProjects() {
var options = {};
db.loadDatabase(options, function() {
projects1 = db.getCollection('projects'); // GET
if (!projects1) {
projects1 = db.addCollection('projects'); // ADD
}
console.log('Database information');
console.log(db);
console.log('Collection information');
console.log(projects1);
});
}
console.log('Insert something');
projects1.insert({ name : 'odin' });
}); // End of .ready()
However, I keep receiving the following error message:
ionic.bundle.js:26794 TypeError: Cannot read property 'insert' of undefined
at controllers.js:309
at ionic.bundle.js:56230
at Object.ready (ionic.bundle.js:2140)
at Object.ready (ionic.bundle.js:56223)
at new <anonymous> (controllers.js:283)
at Object.instantiate (ionic.bundle.js:18010)
at $controller (ionic.bundle.js:23412)
at self.appendViewElement (ionic.bundle.js:59900)
at Object.render (ionic.bundle.js:57893)
at Object.init (ionic.bundle.js:57813)(anonymous function) @ ionic.bundle.js:26794(anonymous function) @ ionic.bundle.js:23507$broadcast @ ionic.bundle.js:30720$state.transition.resolved.then.$state.transition @ ionic.bundle.js:52157processQueue @ ionic.bundle.js:29127(anonymous function) @ ionic.bundle.js:29143$eval @ ionic.bundle.js:30395$digest @ ionic.bundle.js:30211$apply @ ionic.bundle.js:30503done @ ionic.bundle.js:24824completeRequest @ ionic.bundle.js:25022requestLoaded @ ionic.bundle.js:24963
controllers.js:301 Databaseinformation
I need assistance in resolving this issue. It seems like I am encountering similar problems with both SQLite and LokiJS. Any guidance would be greatly appreciated.
Thank you, Christian.
UPDATE-2016-08-05
After spending countless hours searching and testing, I consistently face the same errors. I find it perplexing how tutorials appear to work flawlessly while I struggle to get my code running.
I completely revamped my factory:
(function() {
'use strict';
angular.module('lkr-v4')
.factory('PersistenceService', ['$q', 'Loki', PersistenceService]);
function PersistenceService($q, Loki) {
// Necessary variables
var lkrDb; // Database
var projects; // Collection of JSON strings
// Accessible Members Up Top
// https://github.com/johnpapa/angular-styleguide/tree/master/a1#style-y052
var pService = {
initDB: initDB,
getAllProjects: getAllProjects,
addProject: addProject,
updateProject: updateProject,
deleteProject: deleteProject
};
return pService;
// Initialization of the database
function initDB() {
var idbAdapter = new LokiIndexedAdapter('loki');
lkrDb = new loki('lkr-v4', {
autoload: true,
autoloadCallback: getAllProjects,
autosave: true,
autosaveInterval: 10000,
adapter: idbAdapter
});
}
// Function to return a collection of JSON strings (all found projects) in the LokiJS database file
function getAllProjects() {
// What is $q? See https://docs.angularjs.org/api/ng/service/$q
return $q(function (resolve, reject) {
var options = {};
lkrDb.loadDatabase(options, function () {
projects = lkrDb.getCollection('projects'); // GET!
// If the database file is empty
if (!projects) {
projects = lkrDb.addCollection('projects'); // ADD!
}
resolve(projects.data);
});
});
}
// Function to add a project
function addProject(project) {
if(lkrDebug) {
console.log('Inside of addProject from the factory');
console.log('This is the projects object');
console.log(this.projects);
console.log('This is the given value of the new project');
console.log(project);
}
projects.insert(project);
}
// Function to update a project
function updateProject(project) {
projects.update(project);
}
// Function to delete a project
function deleteProject(project) {
projects.remove(project);
}
} // End of function PersistenceService
})(); // End of IIFE
In my app.js run(), I call PersistenceService.initDB(). THIS WORKS!
All four pages in my app have their own controller implemented via controller as. In the first page's controller, I tried the following code:
// Test #1: Get data
PersistenceService.getAllProjects().then(function(projects) {
pcVm.projects = projects;
if(lkrDebug) {
console.log('Inside of getAllProjects().then() from the controller');
console.log('This is the project object from the PersistenceService');
console.log(projects);
console.log('And this ist the pcVm.projects object from the controller');
console.log(pcVm.projects);
}
});
IT WORKS! I can see the correct information in the console and no errors are thrown.
The subsequent code placed directly after the above code in the same controller adds a project:
// Test #2: Add a project
PersistenceService.addProject({ name : 'odin' });
Executing this produces the following lines (and errors) on the console:
Inside of addProject from the factory
persistence.services.js:65 This is the projects object
persistence.services.js:66 undefined
persistence.services.js:67 This is the given value of the new project
persistence.services.js:68 Object {name: "odin"}
ionic.bundle.js:26794 TypeError: Cannot read property 'insert' of undefined
at Object.addProject (persistence.services.js:70)
at new ProjectsController (projects.controller.js:31)
at Object.instantiate (ionic.bundle.js:18010)
at $controller (ionic.bundle.js:23412)
at self.appendViewElement (ionic.bundle.js:59900)
at Object.render (ionic.bundle.js:57893)
at Object.init (ionic.bundle.js:57813)
at self.render (ionic.bundle.js:59759)
at self.register (ionic.bundle.js:59717)
at updateView (ionic.bundle.js:65398)(anonymous function) @ ionic.bundle.js:26794(anonymous function) @ ionic.bundle.js:23507$broadcast @ ionic.bundle.js:30720$state.transition.resolved.then.$state.transition @ ionic.bundle.js:52157processQueue @ ionic.bundle.js:29127(anonymous function) @ ionic.bundle.js:29143$eval @ ionic.bundle.js:30395$digest @ ionic.bundle.js:30211$apply @ ionic.bundle.js:30503done @ ionic.bundle.js:24824completeRequest @ ionic.bundle.js:25022requestLoaded @ ionic.bundle.js:24963
projects.controller.js:22 Inside of getAllProjects().then() from the controller
projects.controller.js:23 This is the project object from the PersistenceService
projects.controller.js:24 [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
projects.controller.js:25 And this ist the pcVm.projects object from the controller
projects.controller.js:26 [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
This sequence of events seems unusual, as it appears that addProject() gets called before getAllProjects().
To investigate further, I added console.log(lkrDb); in the addProject function and conducted more tests. It became evident that initDB in app.js functions correctly and that the addProject function can operate with the open database.
My inclination is that I may be making a mistake in the controller or with the getAllProjects function.
I will continue my search for a resolution but any pointers would be greatly appreciated.
Thank you, Christian.