coresmart / persistencejs

persistence.js is an asynchronous Javascript database mapper library. You can use it in the browser, as well on the server (and you can share data models between them).
http://persistencejs.org
1.72k stars 240 forks source link

Object #<Object> has no method 'forEach' #72

Open maxbogdanov opened 12 years ago

maxbogdanov commented 12 years ago

Hi,

I've just started using persistence.js. Unfortunately, when I try to run sample from your examples, like

<script src="persistence/persistence.store.sql.js" type="application/javascript"></script>
<script src="persistence/persistence.store.websql.js" type="application/javascript"></script>
<script language="javascript" type="text/javascript">
    persistence.debug = false;
    persistence.store.websql.config(persistence, 'mydcdb', 'MyDC local database', 5 * 1024 * 1024);

    var Task = persistence.define('Task', {
        name: "TEXT",
        description: "TEXT",
        done: "BOOL"
    });

    for (var i = 0; i < 5; i++) {
        var t = new Task();
        t.name = 'Task ' + i;
        t.done = i % 2 == 0;
        persistence.add(t);
    }
    persistence.flush(function () {
        console.log('done flushing');
    });

    Task.all().list(function (results) {
                console.log(results);
                results.forEach(function (r) {
                    console.log(r.name);
                });
            });
</script>

I receive next output: done flushing Object executeSql: function (query, args, successFn, errorFn) { proto: Object defineGetter: function defineGetter() defineSetter: function defineSetter() lookupGetter: function lookupGetter() lookupSetter: function lookupSetter() constructor: function Object() hasOwnProperty: function hasOwnProperty() isPrototypeOf: function isPrototypeOf() propertyIsEnumerable: function propertyIsEnumerable() toLocaleString: function toLocaleString() toString: function toString() valueOf: function valueOf() Uncaught TypeError: Object # has no method 'forEach' (anonymous function) persistence.DbQueryCollection.list.entityNamepersistence.store.sql.js:591 persistence.db.html5.connect.that.transaction

I'm using Chrome and latest download of persistence.js.

MarkMYoung commented 12 years ago

The main problem is that .schemaSync was never called. Also, keep in mind that everything is asynchronous (jQuery Deferred might help you with this). Below is code that works (in Chrome 17.0.963.46):

    persistence.debug = false;
    persistence.store.websql.config(persistence, 'mydcdb', 'MyDC local database', 5 * 1024 * 1024);
    var Task = persistence.define('Task', {
        name: "TEXT",
        description: "TEXT",
        done: "BOOL"
    });
    persistence.schemaSync( function()
    {
        for (var i = 0; i < 5; i++) {
            var t = new Task();
            t.name = 'Task ' + i;
            t.done = i % 2 == 0;
            persistence.add(t);
        }
        persistence.flush(function () {
            console.log('done flushing');
            Task.all().list(function (results) {
                console.log(results);
                results.forEach(function (r) {
                    console.log(r.name);
                });
            });
        });
    });