2016-06-16 4 views
0

У меня есть две модели сущности Студент и посещаемость, так что каждый участник посещаемости имеет связанного родителя-ученика.как применить фильтр даты на запрос предка

Участники Модель:

@Entity 
public class Attendance { 

@Id 
Long id; 
@Index 
Date date; 
@Parent 
@Index 
@ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
Ref<Student> studentRef; 

public Long getId() { 
return id; 
} 

public Date getDate() { 
return date; 
} 

public void setDate(Date date) { 
this.date = date; 
} 
public String getWebsafeKey() { 
return Key.create(studentRef.getKey(), Attendance.class, id).getString(); 
} 
} 

Студенческая модель:

@Entity 
public class Student { 

@Id 
Long id; 
@Index 
String name; 

String student_id; 

Long mobile_number; 
String email; 

@Index 
@ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
List<Ref<Shift>> shiftRef = new ArrayList<Ref<Shift>>(); 

public Long getId() { 
return id; 
} 

public String getStudent_id() { 
return student_id; 
} 

public void setStudent_id(String student_id) { 
this.student_id = student_id; 
} 

public String getName() { 
return name; 
} 

public void setName(String name) { 
this.name = name; 
} 

public Long getMobile_number() { 
return mobile_number; 
} 

public void setMobile_number(Long mobile_number) { 
this.mobile_number = mobile_number; 
} 

public String getEmail() { 
return email; 
} 

public void setEmail(String email) { 
this.email = email; 
} 

public String getWebsafeKey() { 
return Key.create(Student.class, id).getString(); 
} 
} 

Это, как я вставляя объект посещаемости в хранилище данных:

Key<Student> studentKey = Key.create(student_web_safe_key); 
Date date = new Date(); 
date.setTime(System.currentTimeMillis()); 
attendance.setDate(date); 
attendance.studentRef = Ref.create(studentKey); 
ofy().save().entity(attendance).now(); 

Вопросы:

  1. выше магазин запрос дата в хранилище данных в формате: 2016-06-15 (18: 01: 18,845) IST
    Но когда я получить тот же объект без указания своего родителя, то его дает мне date as: "date": "2016-06-15T12: 31: 18.845Z". пожалуйста, объясните это?

  2. Я могу хранить посещаемость, соответствует каждому учащемуся, а также может получить все посещаемость студента. , но как получить доступ учащихся к указанной дате или диапазону дат? Я попробовал запрос на удар: Запрос запроса = ofy(). Load(). Type (Attendance.class) .ancestor (studentKey) .filter ("date =", date);

, но это дает мне следующее исключение:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 

503 Service Unavailable 
    { 
     "code": 503, 
     "errors": [ 
     { 
      "domain": "global", 
      "message": "com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found. recommended index is:\n- kind: Attendance\n ancestor: yes\n properties:\n - name: date\n\nThe suggested index for this query is:\n <datastore-index kind=\"Attendance\" ancestor=\"true\" source=\"manual\">\n  <property name=\"date\" direction=\"asc\"/>\n </datastore-index>\n\n", 
      "reason": "backendError" 
     } 
     ], 
     "message": "com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found. recommended index is:\n- kind: Attendance\n ancestor: yes\n properties:\n - name: date\n\nThe suggested index for this query is:\n <datastore-index kind=\"Attendance\" ancestor=\"true\" source=\"manual\">\n  <property name=\"date\" direction=\"asc\"/>\n </datastore-index>\n\n" 
    } 

ответ

1

Ответ Вопрос 1:

Appengine использует UTC метки времени. Поэтому ваша временная метка преобразуется из вашего часового пояса в UTC. Тем не менее, это все же одна и та же дата и время. Во время вывода вам нужно учитывать, что временная метка может содержать часовой пояс и формат/вычислять местное время соответственно.

Ответ Вопрос 2:

У вас есть вся информация, необходимая в вашей ошибки. Если вы добавите

<datastore-index kind="Attendance" ancestor="true" source="manual"> 
    <property name="date" direction="asc"/> 
</datastore-index> 

datastore-indexes.xml Ваш запрос должен работать. Если файл еще не существует, создайте его под src/main/webapp/WEB-INF/datastore-indexes.xml, рядом с вашим web.xml и appengine-web.xml. Вы можете найти example on this page.

Что касается причины: ответ с этой ошибкой всегда: поскольку для хранилища данных требуется составной индекс для этого запроса.

+0

спасибо за комментарий @konqi ... Я ищу много, но я не нашел хранилище-indexes.xml подаст андроид студию. не могли бы вы рассказать мне, где этот файл находится в студии Android? – Baqir

+0

'datastore-indexes.xml' на самом деле является ссылкой. Щелкните по нему, и вы обнаружите, что файл должен находиться в папке WEB-INF, там же, где находятся ваши web.xml и appengine-web.xml. – konqi

+0

где эта ссылка расположена в студии android? – Baqir

1

Просто хотел бы добавить к ответу konqi, основываясь на комментариях:

Если вы используете Облако Endpoints с Android Studio вы должны сначала переключиться на «проект» вид в навигационной панели, затем перейдите в папку «серверной» затем src-> main-> webapp-> WEB-INF, а затем в этой папке вы должны вручную создать файл datastore-indexes.xml. Вот то, что ваш будет выглядеть так:

<?xml version="1.0" encoding="utf-8"?> 
<datastore-indexes autoGenerate="true"> 
    <!-- NOTE: Not necessary to create composite indexes here for single property indices b.c. they are build in.--> 

    <!-- If you do not specify direction, default is: direction="asc" --> 

    <datastore-index kind="Attendance" ancestor="true" source="manual"> 
     <property name="date" direction="asc"/> 
    </datastore-index> 

</datastore-indexes> 
+0

Я не могу решить, следует ли указывать это как «не ответ», поскольку он не отвечает на вопрос сам по себе. Это должен быть комментарий и/или улучшенный, чтобы быть автономным и/или вы можете отредактировать мой ответ. – konqi

+0

@konqi Я считаю, что если «ответ» помогает людям, которые запутались (как OP, так и будущим читателям), тогда он должен стоять. Эта область использования Cloud Endpoints + Google App Engine плохо документирована, и у начинающих много путаницы. Не стесняйтесь добавлять его к своему ответу, и я удалю мой tho lol =) Я не возражаю – Micro

+0

Ухм, проблема не имеет ничего общего с облачными конечными точками, и индексы на самом деле являются одной из лучших документированных функций. Попытайтесь выяснить, как реализовать пользовательский аутентификатор в Cloud Endpoints, который будет плохо документирован. Основная проблема, которую я имею с вашим ответом, заключается в том, что она отвечает на то, чего не задавали в вопросе. Оператор не запрашивает Android Studio. Этот вопрос возникает из комментариев к моему ответу, поэтому, чтобы понять ваш вопрос, нужно сначала прочитать комментарии. Когда я удаляю свой ответ, ваш смысл не имеет смысла. Вы думаете, это делает вещи менее запутанными? Я согласен. – konqi

Смежные вопросы