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)