Сохранение длинного текста в Google App Engine

#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. (извините, я не знаю архитектуру конечной точки, но это с открытым исходным кодом, вы можете посмотреть там, если текст разрешен)