#java #android #google-app-engine
#java #Android #google-app-engine
Вопрос:
Я пытаюсь сохранить длинную строку в облачном хранилище данных Google (более 500 символов). Я искал в Интернете и обнаружил, что мне нужно использовать Text
вместо String
, поэтому я попытался это сделать.
Я изменил это:
CloudEntity newProfilePicture = new CloudEntity("profiles");
newProfilePicture.put(MainMenu.userNickName, dataToSave);
для этого:
CloudEntity newProfilePicture = new CloudEntity("profiles");
Text dataText = new Text(dataToSave);
newProfilePicture.put(MainMenu.userNickName, dataText);
но программа вылетает..
(Если я сохраняю короткие строки, все работает нормально)
ПРИМЕЧАНИЕ — если это имеет значение, импорт для Text
используемого мной:
com.google.appengine.api.datastore.Text
из jar, который я загрузил (в противном случае eclipse не распознает Text
тип)
logcat:
06-15 16:36:49.710: E/AndroidRuntime(31005): FATAL EXCEPTION: Thread-3184
06-15 16:36:49.710: E/AndroidRuntime(31005): java.lang.NullPointerException
06-15 16:36:49.710: E/AndroidRuntime(31005): at java.util.HashMap.putAll(HashMap.java:507)
06-15 16:36:49.710: E/AndroidRuntime(31005): at com.google.cloud.backend.core.CloudEntity.createCloudEntityFromEntityDto(CloudEntity.java:79)
06-15 16:36:49.710: E/AndroidRuntime(31005): at com.google.cloud.backend.core.CloudBackend.insert(CloudBackend.java:111)
06-15 16:36:49.710: E/AndroidRuntime(31005): at com.google.cloud.backend.core.CloudBackendAsync.access$0(CloudBackendAsync.java:1)
06-15 16:36:49.710: E/AndroidRuntime(31005): at com.google.cloud.backend.core.CloudBackendAsync$1.callBackend(CloudBackendAsync.java:87)
06-15 16:36:49.710: E/AndroidRuntime(31005): at com.google.cloud.backend.core.CloudBackendAsync$1.callBackend(CloudBackendAsync.java:1)
06-15 16:36:49.710: E/AndroidRuntime(31005): at com.google.cloud.backend.core.CloudBackendAsync$BackendCaller.run(CloudBackendAsync.java:402)
Какие-либо советы?
Пожалуйста, ПОМОГИТЕ! : O
Комментарии:
1. более 500 символов на сервере?? есть ли какая-то особая причина для прохождения этого пути
2. одно из ваших значений в hashmap равно null, и вы вставляете null в объект hashmap проверьте свои значения перед его вставкой
3. @IllegalArgument, я пытаюсь сохранить изображение, поэтому я закодировал его в строку (результат — более 500 символов). По какой-то причине текстовое значение, сохраненное на сервере, равно нулю.
Ответ №1:
Из: https://cloud.google.com/developers/articles/mobile-backend-starter-api-reference#cep
Text
не является поддерживаемым типом данных для CloudEntity
. Поддерживаемые типы данных:
String Up to 500 Unicode characters
Integer Converted to BigDecimal when reading the value from backend
Double/Float Converted to BigDecimal when reading the value from backend
Boolean With true or false values
DateTime com.google.api.client.util.DateTime object. is converted to a String when reading the value from backend
List/Map java.util.List or java.util. Map object that can contain strings longer than 500 characters and child List/Map. The elements are not indexed on Datastore and cannot be used as a query filtering/sorting condition. Empty List/Maps are not stored on Datastore
null
Комментарии:
1. Большое вам спасибо!! Я использовал список <Object> только с одним элементом (длинной строкой, которую я хотел сохранить), и это работает! Ты КОРОЛЬ!:)
Ответ №2:
Вы пытаетесь поместить байты в строку, если хотите сохранить байты профиля изображения, используйте com.google.appengine.api.datastore.Blob
, а не Text
.
В любом случае, прочитайте эту документацию, чтобы вам было удобнее работать с хранилищем данных https://developers.google.com/appengine/docs/java/datastore/entities
Комментарии:
1. Спасибо за ваш ответ! Но у меня есть растровое изображение, которое я хочу сохранить, я использую функцию, которая преобразует его в строку, и это работает нормально. Строка, которую я получил (сохранение данных), преобразуется в текст с помощью строки: «Текстовый текст данных = новый текст (сохранение данных);» итак, где я пытаюсь поместить байты в строку? Я этого не понял..
2. Хорошо, тогда вы уверены, что ваша строка не превышает 1 Мбайт (если это так, проверьте, нет ли проблем с кодировкой с сгенерированной строкой, я думаю, что текст принимает кодировку Utf-8)
3. Я попытался сохранить изображение в виде большого двоичного объекта и попытался сохранить строку с чуть более чем 500 символами в виде текста. В обоих случаях logcat показывает нулевое исключение (как подробно описано в вопросе выше). У вас есть какие-либо идеи, почему? или что я могу сделать, чтобы решить эту проблему?
4. Хорошо, я не знаю, почему тогда я предлагаю вам отладить код в Android, чтобы понять, почему значение, переданное createCloudEntityFromEntityDto, равно нулю. Также скажите мне, вы подтверждаете, что он работает со строкой, но не с текстом? если это так, это должно быть нормально, поскольку ваш код, который сохраняется в db, должен быть не на телефоне, а на GAE. Я не понимаю, вы пытаетесь использовать объект GAE в приложении для Android?
5. (извините, я не знаю архитектуру конечной точки, но это с открытым исходным кодом, вы можете посмотреть там, если текст разрешен)