Как извлечь свойства из сущностей в хранилище данных Google App Engine с помощью Java

1

Я использую Google App Engine и пытаюсь запрашивать/извлекать данные из хранилищ данных. Я без каких-либо успехов следил за почти 20 различными учебниками.

Вот изображение моего хранилища данных и соответствующих данных, которые я хранил там:

Изображение 174551

Вот некоторые из кода, который я должен извлечь данные:

//To obtain the keys
final DatastoreService dss=DatastoreServiceFactory.getDatastoreService();
final Query query=new Query("Coupon");
List<Key> keys = new ArrayList<Key>();

//Put the keys into a list for iteration
for (final Entity entity : dss.prepare(query).asIterable(FetchOptions.Builder.withLimit(100000))) {
    keys.add(entity.getKey());
}

try {
    for (int i = 0; i < keys.size(); i++){
        Entity myEntity = new Entity("Coupon", keys.get(i));

        System.out.println("Size of the Keys array = " + keys.size());

        String description = (String) myEntity.getProperty("desc");

        String endDate = (String) myEntity.getProperty("endDate");

        System.out.println("Description = " + description);
        System.out.println("End Date: " + endDate);

        //Map here is empty...
        Map<String, Object> test = myEntity.getProperties();

        System.out.println("MAP SIZE = " + test.size());        
    }
} catch (Exception e){
    e.printStackTrace();
}

    **OUPUT:** 
    Size of the Keys array = 2
    Description = null
    End date = null
    MAP SIZE = 0

Я не знаю, почему описание и конечная дата являются нулевыми. Это явно тянет в правый объект, так как размер показывает 2, что соответствует показанному изображению. Кроме того, когда я печатаю ключи, это также соответствует

(Что-то вроде этого: для keys.get(i).toString(); - Entity [! Global: Купон (123)/Купон (no-id-yet)]:. Или: Key String =! Global: Купон (5730827476402176)

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

Я прошел следующие вопросы Stackoverflow без каких-либо успехов, поэтому, пожалуйста, не закрывайте это с помощью простого дублирующего вопросительного маркера: 1) Как получить все дочерние объекты в Google App Engine (низкоуровневый API) 2) Хранение иерархических данных в хранилище данных Google App Engine? 3) Как вы используете свойства списка в хранилище данных Google App Engine в Java? 4) Массовые обновления в хранилище данных Google App Engine 5) Проверка наличия сущности в хранилище данных Google. ,

  • 0
    cloud.google.com/appengine/docs/java/javadoc/com/google/… Кажется, что «нормальный способ» использует «getProperty», а затем присваивает имя свойству, а не «getProperties»
  • 0
    Действительно, вы правы, строка в моем коде: myEntity.getProperty ("desc"); Пытается сделать это, но возвращается ноль. Я попытался вызвать getProperties () для теста Map <String, Object>, но там тоже не повезло.
Показать ещё 7 комментариев
Теги:
google-app-engine
google-cloud-datastore
entity
gql

2 ответа

2
Лучший ответ

Эврика! Огромное спасибо всем, кто ответил. Патрис и пользователь2649908 особо спасибо, поскольку вы привели меня к ответу.

Итак, Патрис был совершенно прав в том, что я запрашивал ключи, создавал новый объект, а затем пытался разобрать вновь созданный (пустой) объект.

Решение заключалось в том, чтобы использовать PersistenceManager для анализа данных, а затем использовать методы getter/accessor для этого. Ссылка на менеджер сохранения (который я более или менее просто скопировал напрямую, поскольку он работал отлично) находится здесь: Как использовать менеджер сохранения JDO?

Как только я настроил диспетчер персистентности, я смог заставить его вытащить данные с помощью этого кода:

try {
            for (int i = 0; i < keys.size(); i++){

                //See the link for How to use JDO persistence manager on how to use this
                PersistenceManager pm = MyPersistenceManagerClass.getPM();

                //Need to cast it here because it returns an object
                Coupon coupon = (Coupon) pm.getObjectById(Coupon.class, keys.get(i));

                System.out.println("Created by = " + coupon.getCreatedBy());

                System.out.println("Description = " + coupon.getDesc());

                System.out.println("Modified by = " + coupon.getModifiedBy());
            }
        } catch (Exception e){
            e.printStackTrace();
        }
2

вы пробовали это?

//Put the keys into a list for iteration
for (final Entity entity : dss.prepare(query).asIterable   (FetchOptions.Builder.withLimit(100000))) {


String description = (String) entity.getProperty("desc");

    String endDate = (String) entity.getProperty("endDate");

    System.out.println("Description = " + description);
    System.out.println("End Date: " + endDate);
}

В вашем примере вы создаете сущность, и ожидается, что свойства будут пустыми

  • 0
    Это хорошая мысль, но, к сожалению, проблема заключалась в том, что у меня вообще был пустой предмет. Я обновил свой код, чтобы показать решение, которое я придумал

Ещё вопросы

Сообщество Overcoder
Наверх
Меню