2015-05-04 2 views
0

IBM MobileFirst версия: 6.3 Mobile OS: Android 4.4.4MobileFirst Платформа JSONStore Произошла ошибка при чтении из базы данных

У меня есть потребительной случай, когда мы должны хранить один или несколько base64-закодированные изображения строка (ы) в одном документе внутри коллекции. (Из-за характера прецедента невозможно разбить изображения на несколько документов внутри коллекции)

Сохранение до 7 строк в кодировке с кодировкой base64 в одном документе работает по назначению. (В JSONStore добавлен документ с 7 строковыми изображениями base64). Когда документ, содержащий 8 строковых изображений с кодировкой base64, был добавлен в тот же документ внутри коллекции. Документ успешно добавлен в коллекцию. Но когда findAll() вызывается в коллекции (он содержит только один документ с 8 изображениями с кодировкой base64, в этом случае необходимо найти findAll(), потому что данные для заполнения поля поиска отсутствуют в то время, когда данные извлекается из коллекции); следующие ошибки больше появляться:

Java:

E/JSONSTORE(24451): JSONStoreLogger.logError in JSONStoreLogger.java:189 :: Error when attempting to find a document. An error occurred when reading from the database. 
E/JSONSTORE(24451): com.worklight.jsonstore.exceptions.JSONStoreFindException: Error when attempting to find a document. An error occurred when reading from the database. 
E/JSONSTORE(24451):  at com.worklight.jsonstore.api.JSONStoreCollection.findDocuments(JSONStoreCollection.java:896) 
E/JSONSTORE(24451):  at com.worklight.androidgap.jsonstore.dispatchers.FindActionDispatcher.databaseActionDispatch(FindActionDispatcher.java:117) 
E/JSONSTORE(24451):  at com.worklight.androidgap.jsonstore.dispatchers.BaseDatabaseActionDispatcher.actionDispatch(BaseDatabaseActionDispatcher.java:36) 
E/JSONSTORE(24451):  at com.worklight.androidgap.jsonstore.dispatchers.BaseActionDispatcher.dispatch(BaseActionDispatcher.java:90) 
E/JSONSTORE(24451):  at com.worklight.androidgap.plugin.DispatchingPlugin$ActionDispatcherRunnable.run(DispatchingPlugin.java:79) 
E/JSONSTORE(24451):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
E/JSONSTORE(24451):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
E/JSONSTORE(24451):  at java.lang.Thread.run(Thread.java:841) 
E/JSONSTORE(24451): Caused by: java.lang.IllegalStateException: get field slot from row 0 col 0 failed 
E/JSONSTORE(24451):  at net.sqlcipher.CursorWindow.getLong_native(Native Method) 
E/JSONSTORE(24451):  at net.sqlcipher.CursorWindow.getLong(CursorWindow.java:381) 
E/JSONSTORE(24451):  at net.sqlcipher.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:110) 
E/JSONSTORE(24451):  at net.sqlcipher.AbstractCursor.moveToPosition(AbstractCursor.java:195) 
E/JSONSTORE(24451):  at net.sqlcipher.AbstractCursor.moveToNext(AbstractCursor.java:257) 
E/JSONSTORE(24451):  at android.database.CursorWrapper.moveToNext(CursorWrapper.java:166) 
E/JSONSTORE(24451):  at com.worklight.jsonstore.api.JSONStoreCollection.findDocuments(JSONStoreCollection.java:877) 
E/JSONSTORE(24451):  ... 7 more 
E/JSONSTORE(24451): JSONStoreLogger.logError in JSONStoreLogger.java:189 :: error while executing find query on database "tempCollection"com.worklight.jsonstore.exceptions.JSONStoreFindException: Error when attempting to find a document. An error occurred when reading from the database. 
E/JSONSTORE(24451): com.worklight.jsonstore.exceptions.JSONStoreFindException: Error when attempting to find a document. An error occurred when reading from the database. 
E/JSONSTORE(24451):  at com.worklight.jsonstore.api.JSONStoreCollection.findDocuments(JSONStoreCollection.java:896) 
E/JSONSTORE(24451):  at com.worklight.androidgap.jsonstore.dispatchers.FindActionDispatcher.databaseActionDispatch(FindActionDispatcher.java:117) 
E/JSONSTORE(24451):  at com.worklight.androidgap.jsonstore.dispatchers.BaseDatabaseActionDispatcher.actionDispatch(BaseDatabaseActionDispatcher.java:36) 
E/JSONSTORE(24451):  at com.worklight.androidgap.jsonstore.dispatchers.BaseActionDispatcher.dispatch(BaseActionDispatcher.java:90) 
E/JSONSTORE(24451):  at com.worklight.androidgap.plugin.DispatchingPlugin$ActionDispatcherRunnable.run(DispatchingPlugin.java:79) 
E/JSONSTORE(24451):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
E/JSONSTORE(24451):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
E/JSONSTORE(24451):  at java.lang.Thread.run(Thread.java:841) 
E/JSONSTORE(24451): Caused by: java.lang.IllegalStateException: get field slot from row 0 col 0 failed 
E/JSONSTORE(24451):  at net.sqlcipher.CursorWindow.getLong_native(Native Method) 
E/JSONSTORE(24451):  at net.sqlcipher.CursorWindow.getLong(CursorWindow.java:381) 
E/JSONSTORE(24451):  at net.sqlcipher.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:110) 
E/JSONSTORE(24451):  at net.sqlcipher.AbstractCursor.moveToPosition(AbstractCursor.java:195) 
E/JSONSTORE(24451):  at net.sqlcipher.AbstractCursor.moveToNext(AbstractCursor.java:257) 
E/JSONSTORE(24451):  at android.database.CursorWrapper.moveToNext(CursorWrapper.java:166) 
E/JSONSTORE(24451):  at com.worklight.jsonstore.api.JSONStoreCollection.findDocuments(JSONStoreCollection.java:877) 
E/JSONSTORE(24451):  ... 7 more 
E/wl.jsonstore(24451): {"src":"find","err":22,"msg":"INVALID_SEARCH_FIELD","col":"tempCollection","usr":"testUser","doc":{},"res":{}} 

Javascript:

{"src":"findAll","err":22,"msg":"INVALID_SEARCH_FIELD","col":"tempCollection","usr":"testUser","doc":{},"res":{}} 

Есть ли что-то я делаю не так, или что-то я злоупотребляю?

РЕДАКТИРОВАТЬ:

INIT:

var storeDetails = { 
    collections: { 
     tempCollection: {} 
    }, 
    options: { 
     username: 'ausername', 
     password: 'apassword', 
     localKeyGen: true //Optional local key generation flag, default false. 
    } 
}; 

WL.JSONStore.init(storeDetails.collections, storeDetails.options); 

FindAll:

var options = { 
    limit: 1 
}; 
WL.JSONStore.get('tempCollection').findAll(options); 

Base64-закодированной строки изображения: Я с помощью камеры API Кордова (в комплекте с Worklight/MF). Фрагмент кода: Используя Camera.DestinationType.DATA_URL, изображение возвращается как строка с кодировкой base64.

var options = { 
    quality: 100, 
    destinationType: Camera.DestinationType.DATA_URL, 
    sourceType: Camera.PictureSourceType.CAMERA, 
    allowEdit: true, 
    encodingType: Camera.EncodingType.PNG, 
    targetWidth: 500, 
    targetHeight: 500, 
    popoverOptions: CameraPopoverOptions, 
    saveToPhotoAlbum: true, 
    cameraDirection: Camera.Direction.BACK 
}; 

navigator.camera.getPicture(function (imageData) { 
    var doc = { 
     src: imageData; 
    }; 
    WL.JSONStore.get('tempCollection').add(doc); 
}, function (err) { 

}, options); 
+0

Обновлено с помощью функции init и findAll. – laurigu

+0

Можно ли включить полную реализацию JSON Store, которая включает в себя все. – dhineshsundar

+0

Видя как этот чувствительный код для моего клиента, я не могу просто скопировать его/вставить. Я попытаюсь добавить конкретную информацию, что именно вы ищете? – laurigu

ответ

2

Я смог воспроизвести вашу проблему. После добавления некоторых изображений как части одного массива в документе JSON я получил ту же самую ошибку, которую вы представили. Но и до ошибки вы показали, что я могу видеть это другую

05-04 20:27:38.934: E/CursorWindow(32148): need to grow: mSize = 1048576, size = 1107180, freeSpace() = 1048482, numRows = 1 
05-04 20:27:38.934: E/CursorWindow(32148): Attempting to grow window beyond max size (1048576) 
05-04 20:27:38.934: E/Cursor(32148): Failed allocating 1107180 bytes for text/blob at 0,1 
05-04 20:27:38.935: D/Cursor(32148): finish_program_and_get_row_count row 0 
05-04 20:27:39.151: E/CursorWindow(32148): need to grow: mSize = 1048576, size = 1107180, freeSpace() = 1048482, numRows = 1 
05-04 20:27:39.151: E/CursorWindow(32148): Attempting to grow window beyond max size (1048576) 
05-04 20:27:39.151: E/Cursor(32148): Failed allocating 1107180 bytes for text/blob at 0,1 
05-04 20:27:39.152: D/Cursor(32148): finish_program_and_get_row_count row 0 
05-04 20:27:39.152: E/CursorWindow(32148): Bad request for field slot 0,0. numRows = 0, numColumns = 2 

Так что я думаю, что вы подчеркиваете пределы памяти устройства.

Когда вы добавляете несколько снимков в один документ JSON, вы создаете огромный документ JSON. Затем, когда вы его просматриваете, возможно, существует какая-то операция o parsing или что-то подобное, что требует, чтобы весь JSON был выделен в памяти. Результат findAll сам будет содержать этот огромный документ json. И, возможно, это необходимо для использования непрерывного распределения памяти.

Проблема в том, что общий объем памяти, доступной для одного приложения для Android, ограничен. Фактическое значение зависит от производителя устройства. И это не обязательно связано с тем, как «высокое качество» устройства, или общая память, доступная в устройстве. Некоторые производители могут создавать устройства с объемом памяти 2 ГБ, но для каждого приложения доступно всего несколько МБ, поэтому они уделяют приоритетное внимание тому, чтобы многие приложения работали параллельно, а не несколько приложений, использующих все ресурсы.

В конце мое предложение состоит в том, что вы действительно должны хранить каждое изображение в независимом документе JSON. У вас может быть один документ с массивом идентификаторов и изображения, хранящиеся во второй коллекции или другое альтернативное решение.

Также обратите внимание, что это не ограничение JSONStore, а ограничение, наложенное платформой Android. Единственное приложение никогда не будет разрешено потреблять все ресурсы памяти в одиночку, оно всегда ограничено некоторым MB.

+0

Спасибо за подробное объяснение! Я рассмотрю предлагаемые вами решения и попробую выполнить рефакторинг моего кода. – laurigu

+0

Это тоже не удастся при добавлении нескольких изображений ... JSON Store использует Android SQlite db, а размер курсора имеет ограничение в 1 МБ. Поэтому, если вы запрашиваете записи в своем db, вы получите исключение, если результат запроса больше 1 МБ ..., который 7 изображений FullHD достигнет легко. Единственный способ справиться с этим - хранить файлы информации о изображениях и хранить ссылки на них в своей базе данных. –

Смежные вопросы