Повторяющиеся записи в хранилище данных Google - PullRequest
1 голос
/ 04 февраля 2012

Я использую Google App Engine с интерфейсом хранилища данных.

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

Это мой код:

Key key=KeyFactory.createKey("user",Long.parseLong(ID));
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity entity=new Entity("user",key);
entity.setProperty // ...whatever, updating the properties
datastore.put(entity); //by putting an entity it's supposed to
// either create a new one if non exists, or update an entity if it already exists

Я уверен, что ключ остается неизменным во время всех обновлений, что подтверждается в моей консоли администратора:

id=3001   600643316
id=3002   600643316
id=3003   600643316 

создается группа сущностей с одинаковым ключом (600643316).

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

Хранилище данных позволяет только приложению создавать новый объект с именем ключа String, а не числовым идентификатором. Числовые идентификаторы - это системные идентификаторы. Если ключ имеет числовой идентификатор, но не является именем ключа строки, хранилище данных проигнорирует его и заменит назначенный системой числовой идентификатор.

В вашем примере, если ID - строка, вы можете просто удалить бит Long.parseLong() или преобразовать его обратно в строку. KeyFactory.createKey(String kind, String name) создает Key с именем ключа.

0 голосов
/ 05 февраля 2012

Таким образом, кажется, что Дэн прав, и это правильный способ сделать это, как объясняется в руководствах Google, если вы хотите, чтобы ваше приложение создавало ключи из уникальных ключей, которые вы создаете, вам нужно использовать строки. «Вы указываете, должна ли сущность использовать назначенную приложением строку имени ключа или назначенный системой числовой идентификатор в качестве идентификатора при создании объекта. Чтобы задать имя ключа, укажите его в качестве второго аргумента для конструктора сущности: Entity employee = new Entity("Employee","asalieri"); "Кажется, вы правы, в их примере второй аргумент действительно является строкой - user1032663

...