【问题标题】:Google App Engine - Datastore - Get an entity, not by it's keyGoogle App Engine - 数据存储区 - 获取实体,而不是关键
【发布时间】:2017-11-04 23:27:30
【问题描述】:
【问题讨论】:
标签:
android
google-app-engine
google-cloud-platform
【解决方案1】:
你只需要做一个简单的query。您在 GAE 后端使用什么语言?例如,在 Python 中,您会执行以下操作:
def get_user_by_prop(prop, value):
this_user = User.query(getattr(User, prop) == value).get()
return this_user
从您问题中的链接来看,我假设您使用的是 Java?以下是查询的文档:https://cloud.google.com/appengine/docs/standard/java/datastore/retrieving-query-results
他们使用示例的地方:
Query q =
new Query("User")
.setFilter(new FilterPredicate("nickname", FilterOperator.EQUAL, "billybob"));
PreparedQuery pq = datastore.prepare(q);
Entity result = pq.asSingleEntity();
【解决方案2】:
id 属性中存储了什么?它是否有一些有意义的值或只是随机的唯一数字用作唯一标识符?
似乎您可以以不同的方式设计数据库,因此电子邮件地址将成为您的唯一标识符。在这种情况下,您将拥有一个 User 表,其中包含以下属性:
email(您的唯一标识符)、nickname 和 level。
这样你就可以使用下面的代码 sn-p:
Key userEmail; //Get user's email
Entity user = datastore.get(userEmail);
不管怎样,您仍然可以通过使用query 访问您的实体,而无需实体的密钥。这样,您将不会使用实体的键来获取其实例,但您宁愿通过使用给定的属性值并找到具有该属性值的匹配实体来获取所需的实体。
查询看起来像这样:
String userEmail; //Get user's email
Filter propertyFilter =
new FilterPredicate("email", FilterOperator.EQUAL, userEmail);
Query q = new Query("User").setFilter(propertyFilter);
PreparedQuery pq = datastore.prepare(q);
try {
Entity user = pq.asSingleEntity()
//Same as Entity user = datastore.get(userEmail) mentioned above
} catch (TooManyResultsException e) {
// If more than one result is returned from the Query.
// Add code for dealing the exception here
}