【问题标题】:Google App Engine - Datastore - Get an entity, not by it's keyGoogle App Engine - 数据存储区 - 获取实体,而不是关键
【发布时间】:2017-11-04 23:27:30
【问题描述】:

我正在构建一个 Android 应用,并且我正在使用 Google App Engine 来存储用户的数据。我希望用户能够从其他设备连接到他们的帐户,但我不知道如何。

用户表(种类)有 4 个属性:id, email, nickname and level:

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

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

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

【问题讨论】:

    标签: 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
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多