Я создаю приложение, которое имеет два основных типа прямо сейчас: пользователь и поездка
Каждый объект пользователя уникален, тогда как Пользователь может иметь много потенциальных объектов 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();
}
}
Насколько я знаю, поскольку я не знаю, что каждый уникальный ключ для каждой поездки, мне сначала нужно было выполнить запрос, чтобы получить Сущность, из которой я приобрел ключ, как показано ниже:
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
date
. В сущностях будет сосредоточено определенное хранилище данных. Чтобы избежать горлышка бутылки, просто оставьте его пустым (автоматически). И рассмотрите поездки с тем же городом, когда вы используете deleteTrip()
getTrips()
, он может знать каждый идентификатор поездки (ключ). Используйте это, чтобы удалить.
deleteTrip()
. Вы должны знать ключ поездки или запросить поездки, которые имеют одного и того же предка сcity