Sqlite doesnt run on device

8 posts, 0 answers
  1. Keen
    Keen avatar
    101 posts
    Member since:
    Mar 2013

    Posted 15 Jul 2013 Link to this post

    //Based on http://www.html5rocks.com/en/tutorials/webdatabase/todo/

    document.addEventListener("deviceready", init, false);

     

     

    var app = {};

    app.db = null;

     

    app.openDb = function() {

    if(window.sqlitePlugin !== undefined) {

    app.db = window.sqlitePlugin.openDatabase("CALCMENU");

    alert("SQLITE");

    } else {

    // For debugin in simulator fallback to native SQL Lite

    console.log("Use built in SQL Lite");

    app.db = window.openDatabase("CALCMENU", "1.0", "Cordova Demo", 500000);

    }

    }

     

    app.createTable = function() {

    var db = app.db;

    db.transaction(function(tx) {

    //code for creating

    });

     

    }

     

    //some functions

    function init() {

    navigator.splashscreen.hide();

    app.openDb();

    app.createTable();

    uuid = device.uuid;

    App = new downloadApp();

    folderName = "RecipeImages";

    App.run(folderName);

    $.support.touchOverflow = true;

    $.mobile.touchOverflowEnabled = true;

    cordova.require('cordova/plugin/powermanagement').acquire(

    function() { alert( 'successfully acquired full wake lock' ); })

     

    }




    The above code is my whole code in my main.js . When using the sample SQLite apps of Icenium on device, its running that he used SQLite as database. But I applied the codes that I need to the my apps,but when I deploy on device, He used the websql not the SQLite cordova. Am I missing something on my codes?

    thanks
    Keen
  2. Steve
    Admin
    Steve avatar
    10941 posts

    Posted 15 Jul 2013 Link to this post

    Hello Keen,

    Be sure to include the SQLite plug-in into your app, see Enable and Configure Integrated Plugins help article. As you already have a runnable demo at your disposal, you can compare the differences or use that demo as a starting point for your app i.e. add the files for your app into the sqlite demo and continue your development there.

    Regards,
    Steve
    Telerik

    Looking for tips & tricks directly from the Icenium team? Check out our blog!
    Missed our first webinar, watch it here.
    Share feedback and vote for features on our Feedback Portal.
  3. Martin Roussel
    Martin Roussel avatar
    246 posts
    Member since:
    Jan 2010

    Posted 07 Jan 2014 Link to this post

    Hi, im also experiencing problems with SQLite on three different devices (Android Phone 2.3.4, Android tablet 4.0.3 and iPod 6.1.5). First on the three devices, the SQLite sample runs fine. The problem is when I want to integrate it in my current app. On all simulators, my app is fine also (using built-in SQLite). Ive enabled the plugin in my project properties and running Cordova 3.2.0.

    On the two Android devices it fails at this line:
    app2.db = window.sqlitePlugin.openDatabase("Todo");

    On the iOS, everything seems to work well except I sometimes get "disk I/O error" when executing this (It seems to always occur when refreshing the app without closing it):

    tx.executeSql("INSERT INTO todo(todo, added_on) VALUES (?,?)",
                                 ['hello', new Date()],
                                 app2.onSuccess,
                                 app2.onError);

    here is my app.js (which shares some logic for Skin...please dont min the bunch of alert im using to test)
    (function (global) {
        var mobileSkin = "",
            app = global.app = global.app || {};
        var app2 = {};
        app2.db = null;
         
        document.addEventListener("deviceready", function () {
            app.application = new kendo.mobile.Application(document.body, { layout: "tabstrip-layout" });
            navigator.splashscreen.hide();
            app2.openDb();
            app2.createTable();
            app2.deleteTodo();
            app2.addTodo('allo');
            
        }, false);
         
        document.addEventListener("touchstart", function() {}, false);
     
        app2.openDb = function() {
           alert("opening");
          if (device.uuid == "e0101010d38bde8e6740011221af335301010333" || device.uuid == "e0908060g38bde8e6740011221af335301010333") {
            // For debugin in simulator fallback to native SQL Lite
            alert("Use built in SQL Lite");
            app2.db = window.openDatabase("Todo", "1.0", "Cordova Demo", 200000);
        }
        else {
             alert("sqlitePlugin");
            app2.db = window.sqlitePlugin.openDatabase("Todo");
            alert("OK");
        }
           alert(app2.db);
        };
         
        app2.createTable = function() {
            var db = app2.db;
            alert("create");
            db.transaction(function(tx) {
                 alert("create in");
                tx.executeSql("CREATE TABLE IF NOT EXISTS todo(ID INTEGER PRIMARY KEY ASC, todo TEXT, added_on DATETIME)", []);
            });
            alert("create out");
        };
         
        app2.onError = function(tx, e) {
            alert("Error: " + e.message);
        };
               
        app2.onSuccess = function(tx, r) {
            alert("success");
             
            var render = function (tx, rs) {
                 
                for (var i = 0; i < rs.rows.length; i++) {
                   alert(i + " " + rs.rows.item(i));
                }
               
                 
            }
         
            var db = app2.db;
            db.transaction(function(tx) {
                tx.executeSql("SELECT * FROM todo", [],
                              render,
                              app2.onError);
            });
        };
       
        app2.addTodo = function(todoText) {
                var db = app2.db;
                alert("insert");
                db.transaction(function(tx) {
                    alert("insert in");
                    var addedOn = new Date();
                    tx.executeSql("INSERT INTO todo(todo, added_on) VALUES (?,?)",
                                  [todoText, addedOn],
                                  app2.onSuccess,
                                  app2.onError);
                });
            alert("insert out");
            };
         
        app2.deleteTodo = function(id) {
            var db = app2.db;
            db.transaction(function(tx) {
                tx.executeSql("DELETE FROM todo",[]);
            });
        }
         
     
        app.changeSkin = function (e) {
            if (e.sender.element.text() === "Flat") {
                e.sender.element.text("Native");
                mobileSkin = "flat";
            }
            else {
                e.sender.element.text("Flat");
                mobileSkin = "";
            }
     
            app.application.skin(mobileSkin);
        };
         
        
             
    })(window);

    Is there something im doing wrong?

    TIA
  4. Steve
    Admin
    Steve avatar
    10941 posts

    Posted 10 Jan 2014 Link to this post

    Hello Martin,

    I've used your t***-*****n app to test locally on Android, but did not notice any errors or problems compared to what I observed in the Icenium simulator in the test tab. Can you share exact steps I need to follow in your app that fail?

    Regards,
    Steve
    Telerik
    You've missed the Icenium Visual Studio Integration keynote? It has been recorded and posted here.
    Looking for tips & tricks directly from the Icenium team? Check out our blog!
    Share feedback and vote for features on our Feedback Portal.
  5. Martin Roussel
    Martin Roussel avatar
    246 posts
    Member since:
    Jan 2010

    Posted 10 Jan 2014 Link to this post

    Thanks for the reply Steve.

    On both of my Android devices, I only have to open the app and two alert should pop at startup. 1-"sqlitePlugin" and 2-"OK". On both devices, I never see the "OK" one, but the same code works for the sample-sqlite (I see the "OK"). Here is the logic:

    if (device.uuid == "e0101010d38bde8e6740011221af335301010333" || device.uuid == "e0908060g38bde8e6740011221af335301010333") {
            // For debugin in simulator fallback to native SQL Lite
            app.db = window.openDatabase("Todo", "1.0", "Cordova Demo", 200000);
        }
        else {
            alert("sqlitePlugin");
            app.db = window.sqlitePlugin.openDatabase("Todo");
            alert("OK");
        }
  6. Martin Roussel
    Martin Roussel avatar
    246 posts
    Member since:
    Jan 2010

    Posted 13 Jan 2014 Link to this post

    UPDATE: ive succeed to make it work on the android tablet by moving the app.openDB() and app.createTable() from the deviceready function (app.js) to the $( document ).ready() function on the page itself. This also works on the iOS but not on the android phone.

    UPDATE2 : ive succeed to make it work (android tablet and iOS only, not android phone) by putting the openDB and createTable back in the app.js like it was... but I need to have this div on the page to make it work:

    <div data-role="view"></div>

    no clue why
  7. Steve
    Admin
    Steve avatar
    10941 posts

    Posted 13 Jan 2014 Link to this post

    Hi Martin,

    Glad you found a working solution. How did you attach deviceready event in your app in a first place? As per Cordova docs, it should be attached in onload event.

    Regards,
    Steve
    Telerik
    You've missed the Icenium Visual Studio Integration keynote? It has been recorded and posted here.
    Looking for tips & tricks directly from the Icenium team? Check out our blog!
    Share feedback and vote for features on our Feedback Portal.
  8. Martin Roussel
    Martin Roussel avatar
    246 posts
    Member since:
    Jan 2010

    Posted 13 Jan 2014 Link to this post

    Steve,

    like this 
    document.addEventListener("deviceready", function () {
            app.application = new kendo.mobile.Application(document.body, { layout: "tabstrip-layout" });
            navigator.splashscreen.hide();
            app.openDb();
            app.createTable(); 
        }, false);

    it is not a real solution since it should work on my android phone (like the sample)
Back to Top