2012-02-04 3 views
0

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

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

Это мой код:

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).

ответ

1

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

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

0

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

+0

Вы должны отметить его ответ, как принято тогда. – DTing