Google App Engine - 数据存储 - 获取一个实体,而不是它的关键

时间:2017-06-03 19:25:36

标签: android google-app-engine google-cloud-platform

我正在制作Android应用,并且我使用Google App Engine来存储用户的数据。我希望用户能够从其他设备连接到他们的帐户,但我无法弄清楚如何。

用户表(种类)有4个属性:id, email, nickname and levelenter image description here

我读过这个: https://cloud.google.com/appengine/docs/standard/java/datastore/creating-entities

它写的是我只能通过他们的密钥获取实体,这对我来说是个问题,因为在新设备中,我只能收到用户的电子邮件,而不是密钥和Id。 我需要通过电子邮件获取密钥和ID。

这可能吗? 如果不是,那么他们是否有其他解决方案?

2 个答案:

答案 0 :(得分:1)

id属性存储的内容是什么?它是否具有一些有意义的值或只是随机唯一编号用作唯一标识符?
您似乎可以设计不同的数据库,因此电子邮件地址将是您的唯一标识符。在这种情况下,您将拥有一个包含以下属性的User表:
email (您的唯一标识符)nicknamelevel
这样您就可以使用以下代码段:

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
}

答案 1 :(得分:0)

你只需要做一个简单的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();