Не удается заново создать ключ хранилища данных Google в базе данных с тем же идентификатором

1

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

Каждый объект пользователя уникален, тогда как Пользователь может иметь много потенциальных объектов Trip.

Пара проблем, которые связаны друг с другом:

1) Используя класс, который я написал ниже, я могу создать новый User (метод addUser), но приложение не распознает, что пользователь существует во второй раз, он просто постоянно создает нового пользователя (и заменяет предыдущий, потому что они имеют одно и то же имя).

2) Удаление поездки (метод deleteTrip) не работает, хотя ключ должен уже существовать в хранилище данных

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

Вот мой код:

public class Persistence {

static Logger logger = Logger.getLogger(Persistence.class.toString());
private static DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();


public static ArrayList<Trip> getTrips(String uniqueID) {
    ArrayList<Trip> trips = new ArrayList<Trip>();

        Key ancestorKey = KeyFactory.createKey("User", uniqueID);

        Query query = new Query("Trip", ancestorKey);
        List<Entity> tripsFromCloud = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(10));

        for( int i = 0 ; i < tripsFromCloud.size() ; i++ ) {
            Entity tripEntity = tripsFromCloud.get(i);
            String city = tripEntity.getProperty("city").toString();
            String leaveDate = "";
            String returnDate = "";

            if( tripEntity.getProperty("leaveDate") != null ) {
                leaveDate = tripEntity.getProperty("leaveDate").toString();
            }

            if( tripEntity.getProperty("returnDate") != null ) {
                returnDate = tripEntity.getProperty("returnDate").toString();
            }

            Trip t = new Trip();
            t.setCity(city);
            t.setArriving(leaveDate);
            t.setReturning(returnDate);
            trips.add(t);

    }

    return trips;
}

public static void addTrip(String uniqueID, String city, String leaveDate, String returnDate) {


    Key ancestorKey = KeyFactory.createKey("User", uniqueID);

    Date date = new Date();

    Key key = KeyFactory.createKey(ancestorKey, "Trip", date.toString() + uniqueID);

    Entity newTrip = new Entity(key);

    newTrip.setProperty("city", city);
    newTrip.setProperty("leaveDate", leaveDate);
    newTrip.setProperty("returnDate", returnDate);


    datastore.put(newTrip);

}

public static void deleteTrip(String uniqueID, String city) {

    Key key = KeyFactory.createKey("User", uniqueID);

    datastore.delete(key);

}

public static void addUser(String uniqueID) {

        Transaction txn = datastore.beginTransaction();
        Key userKey = KeyFactory.createKey("User", uniqueID);
        Entity user = null;
        try {
            user = datastore.get(userKey);
            logger.log(Level.INFO, "Found user: " + user.getKey().getName());
        } catch (EntityNotFoundException e) {
            user = new Entity(userKey);
            user.setProperty("id", uniqueID);
            user.setProperty("about", "");
            userKey = datastore.put(user);
            logger.log(Level.INFO, "Created new user with id: " + uniqueID);
        }
        txn.commit();

    }

}
  • 1
    2) Если вы хотите удалить конкретную поездку в deleteTrip() . Вы должны знать ключ поездки или запросить поездки, которые имеют одного и того же предка с city
  • 0
    1) Нужно больше информации. Покажи мне логи.
Показать ещё 2 комментария
Теги:
google-app-engine
google-cloud-datastore

1 ответ

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

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

private static Key getKeyForCity(String uniqueID, String city) {

    Key ancestorKey = KeyFactory.createKey("User", uniqueID);

    Query query = new Query("Trip", ancestorKey);
    query.addFilter("city", FilterOperator.EQUAL, city);
    Entity trip = datastore.prepare(query).asSingleEntity();

    return trip.getKey();
}

Когда у меня был правильный ключ, было легко удалить Entity:

public static void deleteTrip(String uniqueID, String city) {

    Key key = getKeyForCity(uniqueID, city);

    datastore.delete(key);

}

Мои проблемы с добавлением пользователя волшебным образом очищены после обновления с App Engine 1.6 до 1.9

  • 1
    Поздравляю. Если вы хотите сделать более надежным, не делайте ключ поездки по date . В сущностях будет сосредоточено определенное хранилище данных. Чтобы избежать горлышка бутылки, просто оставьте его пустым (автоматически). И рассмотрите поездки с тем же городом, когда вы используете deleteTrip()
  • 1
    Также, если пользователь вызвал getTrips() , он может знать каждый идентификатор поездки (ключ). Используйте это, чтобы удалить.

Ещё вопросы

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