SQLite on Android device - Could not allocate CursorWindow '/data/data/com.apps.validadorbr/files/validadorbr.sqlite' of size 2097152 due to error -12.

Fuse Version: 0.36.1 on MacOS

I’m struggling through problems and problems with SQLite + Fuse. I made some workarounds and everything works when I run under previews (local and Android), but when I compile it using uno clean && uno build -tandroid -DGRADLE and install on my Android devices (smartphone and tablet) I get this CursorWindow exception.

This is my complete source code:

var Observable = require("FuseJS/Observable");
var items = Observable();
var orderNumber = Observable();
var ticketListGlobal = null;
var validatedTicketsGlobal = null;
var sqlite = require('SQLite');
var db = sqlite.open("validadorbr.sqlite");

ticketListGlobal = this.Parameter.map(function(param) {
    if ( param.eventId != null && param.eventId != undefined && param.eventId != '' ) {

            var uri = "http://myurl.com/ticket/list/" + param.eventId;
           	debug_log( "Executing request to: " + uri );
           	fetch(uri, {
                 method: "GET",
                 headers: {
                      "Content-type": "application/json; charset=UTF-8"
                 }
            }).then(function getResponseFromServer(response){
       		 debug_log( "Returned Json" );
                return response.json();
            }).then(function readResponse(json){
           	 	if ( json.status == "Ok" ) {
           			debug_log( "Response ok, preparing to read Json" );
           			if ( json.content.length == 0 ) {
           				router.goto("error");
           			} else {
           				ticketListGlobal = json.content;
                        debug_log( "ticketListGlobal: " + ticketListGlobal );
                        //if ( !(ticketListGlobal.value === undefined) ) {
                            debug_log( "Opening database file: " + new Date() );
                            debug_log( "Creating table: " + new Date() );
                            createTable();
                            debug_log( "Table well created: " + new Date() );
                            updateTicketList( ticketListGlobal );
                            debug_log( "Update / inserting new registers: " + new Date() );
                            select();
                            ticketListGlobal.clear();
                        //}
           			}
           	 	} else {
           	 		//showErrorDialog(json.message);
                    debug_log( "Error to get data from server" );
           	 	}
            });

            ticketListGlobal = param.ticketListParam;
            debug_log( "Loading TicketList - Parameter value: " + ticketListGlobal );
        }

    return ticketListGlobal;
});

function searchTicketsByOrderNumber() {
    var ticketListByOrderNumber = db.query("SELECT * FROM tickets_information WHERE order_number = ? AND validation_time = ''", orderNumber.value);
    items.clear();
    for ( var i in ticketListByOrderNumber ) {
        items.add( ticketListByOrderNumber[i] );
    }
}

function validateTicket(selectedItem) {
    var ticket = selectedItem.data;
    updateTicketValidationTime( ticket );
}

function updateTicketValidationTime(ticket) {
    db.execute("UPDATE tickets_information SET validation_time = ? WHERE order_key = ?", new Date(), ticket.order_key);
    items.remove(ticket);
}

function validateOrder() {
    var ticketList = items.toArray();
    for( var i in ticketList ) {
        updateTicketValidationTime( ticketList[i] );
    }
}

function dropTable() {
    //debug_log( "Executing dropTable method..." );
    db.execute( "DROP TABLE tickets_information" );
}

function select() {
    var r = db.query("SELECT count(*) AS qtd FROM tickets_information");
    debug_log(JSON.stringify(r));
}

function createTable() {
    debug_log( "Executing createTable method..." );
    var table = "CREATE TABLE IF NOT EXISTS tickets_information ( ";
        table += " event_id INTEGER, ";
        table += " order_number INTEGER, ";
        table += " order_type TEXT, ";
        table += " sector TEXT, ";
        table += " seat TEXT, ";
        table += " order_key TEXT, ";
        table += " order_status INTEGER, ";
        table += " validation_time TEXT );";
    db.execute( table );
}

function updateTicketList(tickets) {
    //debug_log( "Executing updateTicketList method... " + tickets.length );
	// Iterate over the collection of data
	for ( var i in tickets ) {
		ticketUpdateOrInsertRow(tickets[i]);
	}
}

function ticketUpdateOrInsertRow(ticket) {
    var r = db.query("SELECT order_number FROM tickets_information WHERE order_number = ? AND order_key = ?", ticket.orderNumber, ticket.orderKey);
    //debug_log( "SQL Result - length: " + r.length );
    //debug_log( "SQL Result: " + JSON.stringify( r ) );
    if ( r.length == 0 ) {
        debug_log( "Inserting new register: " + ticket.orderNumber + " / " + ticket.orderKey );
        db.execute( "INSERT INTO tickets_information (event_id, order_number, order_type, sector, seat, order_key, order_status, validation_time) VALUES (?,?,?,?,?,?,?,?)",
     				ticket.eventId, ticket.orderNumber, ticket.orderType, ticket.sector, ticket.seat, ticket.orderKey, ticket.orderStatus, ticket.validationTime);
    }
}


function goToLogin() {
    router.goto("login");
}

module.exports = {
    orderNumber: orderNumber,
    items: items,
    ticketListGlobal: ticketListGlobal,
    goToLogin: goToLogin,
    searchTicketsByOrderNumber: searchTicketsByOrderNumber,
    validateTicket: validateTicket,
    validateOrder: validateOrder
}

Here is part of JSON’s response that will be saved on local SQLite (the original one has about 1.000 registers):

{"status":"Ok","message":"Success","content":[{"eventId":343,"orderNumber":85638,"orderType":"SETOR C | ANTECIPADO","sector":"SETOR C","seat":"C-372","orderKey":"0AjMzIzMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":103217,"orderType":"SETOR C | ANTECIPADO","sector":"SETOR C2","seat":"C-474","orderKey":"0AjNwkzMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":50640,"orderType":"SETOR C | ANTECIPADO","sector":"SETOR C","seat":"C-234","orderKey":"0ATM1kTMwADMwADMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":37946,"orderType":"SETOR A | ANTECIPADO","sector":"SETOR A","seat":"A-037","orderKey":"0ATN0QTMwADMwADMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":35859,"orderType":"SETOR D | ANTECIPADO","sector":"SETOR D","seat":"D-083","orderKey":"0ATO2MTMwADMwADMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":93485,"orderType":"SETOR B | ANTECIPADO","sector":"SETOR B2","seat":"B-441","orderKey":"0AzNzUzMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":97209,"orderType":"SETOR D | ANTECIPADO","sector":"SETOR D2","seat":"D-222","orderKey":"0cDM5YzMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":82674,"orderType":"SETOR D | ANTECIPADO","sector":"SETOR D","seat":"D-151","orderKey":"0cjMyEzMwADMwADMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":97248,"orderType":"SETOR B | ANTECIPADO","sector":"SETOR B2","seat":"B-460","orderKey":"0cTM5YzMwADMwADMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":40171,"orderType":"SETOR C | ANTECIPADO","sector":"SETOR C","seat":"C-271","orderKey":"0cTOwUTMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":41055,"orderType":"SETOR C | ANTECIPADO","sector":"SETOR C","seat":"C-265","orderKey":"0EDM5UTMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":62537,"orderType":"SETOR D | ANTECIPADO","sector":"SETOR D","seat":"D-126","orderKey":"0ETMxQjMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":41563,"orderType":"SETOR B | ANTECIPADO","sector":"SETOR B","seat":"B-267","orderKey":"0ETMyYTMwADMwADMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":60570,"orderType":"SETOR B | ANTECIPADO","sector":"SETOR B","seat":"B-346","orderKey":"0ETOzMjMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":86888,"orderType":"SETOR C | ANTECIPADO","sector":"SETOR C","seat":"C-387","orderKey":"0EzM4IzMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":35927,"orderType":"SETOR D | ANTECIPADO","sector":"SETOR D","seat":"D-064","orderKey":"0gDM3MTMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""},{"eventId":343,"orderNumber":97048,"orderType":"SETOR A | ANTECIPADO","sector":"SETOR A2","seat":"A-224","orderKey":"0gDN4YzMwADMzQzMwADMwADM3cTMwADMwADM","orderStatus":0,"validationTime":""}]}

And here is the error (from adb logcat):

V/CursorWindow( 1808): in create, mmap return errno
E/CursorWindow( 1808): Could not allocate CursorWindow '/data/data/com.apps.validadorbr/files/validadorbr.sqlite' of size 2097152 due to error -12.
W/System.err( 1808): android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=741 (# cursors opened by this proc=741)
W/System.err( 1808): 	at android.database.CursorWindow.<init>(CursorWindow.java:104)
W/System.err( 1808): 	at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
W/System.err( 1808): 	at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:154)
W/System.err( 1808): 	at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:148)
W/System.err( 1808): 	at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
W/System.err( 1808): 	at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)
W/System.err( 1808): 	at com.foreign.SQLiteImpl.QueryImpl357(SQLiteImpl.java:44)
W/System.err( 1808): 	at com.Bindings.ExternedBlockHost.QueryImpl357(ExternedBlockHost.java:1653)
W/System.err( 1808): 	at dalvik.system.NativeStart.run(Native Method)
I/validadorbr( 1808): Uno.Exception: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=741 (# cursors opened by this proc=741)
D/validadorbr( 1808): Uno.Exception: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=741 (# cursors opened by this proc=741)
D/AndroidRuntime( 1808): Shutting down VM
W/dalvikvm( 1808): threadid=1: thread exiting with uncaught exception (group=0x412f99a8)
W/dalvikvm( 1808): threadid=1: uncaught exception occurred
W/System.err( 1808): java.lang.RuntimeException: Uno.Exception: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=741 (# cursors opened by this proc=741)
W/System.err( 1808): 	at com.Bindings.ExternedBlockHost.callUno_Uno_Platform_AndroidDisplay_OnFrameCallback55(Native Method)
W/System.err( 1808): 	at com.foreign.Uno.Platform.AndroidDisplay$1.doFrame(AndroidDisplay.java:55)
W/System.err( 1808): 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:774)
W/System.err( 1808): 	at android.view.Choreographer.doCallbacks(Choreographer.java:579)
W/System.err( 1808): 	at android.view.Choreographer.doFrame(Choreographer.java:547)
W/System.err( 1808): 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
W/System.err( 1808): 	at android.os.Handler.handleCallback(Handler.java:800)
W/System.err( 1808): 	at android.os.Handler.dispatchMessage(Handler.java:100)
W/System.err( 1808): 	at android.os.Looper.loop(Looper.java:194)
W/System.err( 1808): 	at android.app.ActivityThread.main(ActivityThread.java:5370)
W/System.err( 1808): 	at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err( 1808): 	at java.lang.reflect.Method.invoke(Method.java:525)
W/System.err( 1808): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
W/System.err( 1808): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
W/System.err( 1808): 	at dalvik.system.NativeStart.main(Native Method)
W/dalvikvm( 1808): threadid=1: calling UncaughtExceptionHandler
E/AndroidRuntime( 1808): FATAL EXCEPTION: main
E/AndroidRuntime( 1808): java.lang.RuntimeException: Uno.Exception: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=741 (# cursors opened by this proc=741)
E/AndroidRuntime( 1808): 	at com.Bindings.ExternedBlockHost.callUno_Uno_Platform_AndroidDisplay_OnFrameCallback55(Native Method)
E/AndroidRuntime( 1808): 	at com.foreign.Uno.Platform.AndroidDisplay$1.doFrame(AndroidDisplay.java:55)
E/AndroidRuntime( 1808): 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:774)
E/AndroidRuntime( 1808): 	at android.view.Choreographer.doCallbacks(Choreographer.java:579)
E/AndroidRuntime( 1808): 	at android.view.Choreographer.doFrame(Choreographer.java:547)
E/AndroidRuntime( 1808): 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
E/AndroidRuntime( 1808): 	at android.os.Handler.handleCallback(Handler.java:800)
E/AndroidRuntime( 1808): 	at android.os.Handler.dispatchMessage(Handler.java:100)
E/AndroidRuntime( 1808): 	at android.os.Looper.loop(Looper.java:194)
E/AndroidRuntime( 1808): 	at android.app.ActivityThread.main(ActivityThread.java:5370)
E/AndroidRuntime( 1808): 	at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1808): 	at java.lang.reflect.Method.invoke(Method.java:525)
E/AndroidRuntime( 1808): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
E/AndroidRuntime( 1808): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
E/AndroidRuntime( 1808): 	at dalvik.system.NativeStart.main(Native Method)