【问题标题】:Store and Search on key and value pair on appengine datastore在 appengine 数据存储上存储和搜索键值对
【发布时间】:2013-12-31 05:55:14
【问题描述】:

我想将多个自定义键和值对存储在另一个模型内的 Google Datastore 实体上作为子实体。我发现有两种方法可以做到这一点

HashMap<String, String> map = new HashMap<String, String>()

(或)

List<KeyValuePair> pairs = new ArrayList<KeyValuePair>()

我真的不知道哪种方法是正确的。

我还想通过用户指定的键和值对进行搜索以获取父实体。搜索也可以有多个键值对。

请帮我做。

【问题讨论】:

  • 是的,我使用 java 和 JDO。

标签: java google-app-engine search google-cloud-datastore jdo


【解决方案1】:

Google AppEngine 数据存储区仅写入和读取 Java 数据存储区 Entities, Properties, and Keys 文档中列出的简单 Java 数据类型,而不是 HashMap 或 List 集合。但是,可以遍历这些集合并将每个成员存储为单独的记录。数据存储区使用字符串或长整数作为每条记录的键(也称为 ID 或名称)。因此,最适合您的 Java 程序的是 HashMap

既然您愿意接受建议,那么使用 Datastore 低级 API 而不是 JDO 怎么样?您的要求是轻量级的,低级实现可能更简单。例如:

// Make up some sample data
java.util.HashMap<String,String> capitals = new java.util.HashMap<String,String>();
capitals.put("France","Paris");
capitals.put("Peru","Lima");
// Create the records
com.google.appengine.api.datastore.DatastoreService datastoreService;
datastoreService = com.google.appengine.api.datastore.DatastoreServiceFactory.getDatastoreService();
for (String country : capitals.keySet()) {
    com.google.appengine.api.datastore.Entity capitalEntity;
    capitalEntity = new com.google.appengine.api.datastore.Entity("Capitals", country);
    capitalEntity.setUnindexedProperty("capital", capitals.get(country));  // or setProperty if you prefer
    datastoreService.put(capitalEntity);
}
// Retrieve one record
String wantedCountry = "Peru", wantedCapital;
com.google.appengine.api.datastore.Query query;
com.google.appengine.api.datastore.PreparedQuery pq;
com.google.appengine.api.datastore.Entity entity;
com.google.appengine.api.datastore.Key wantedKey;
com.google.appengine.api.datastore.Query.Filter filter;
query = new com.google.appengine.api.datastore.Query("Capitals");
wantedKey = com.google.appengine.api.datastore.KeyFactory.createKey("Capitals", wantedCountry);
filter = new com.google.appengine.api.datastore.Query.FilterPredicate(
        com.google.appengine.api.datastore.Entity.KEY_RESERVED_PROPERTY,
        com.google.appengine.api.datastore.Query.FilterOperator.EQUAL,
        wantedKey );
query.setFilter(filter);
pq = datastoreService.prepare(query);
entity = pq.asSingleEntity();
wantedCapital = (String) entity.getProperty("capital");
// Retrieve all records
java.lang.Iterable<com.google.appengine.api.datastore.Entity> entities;
java.util.Iterator<com.google.appengine.api.datastore.Entity> entityIterator;
query = new com.google.appengine.api.datastore.Query("Capitals");
pq = datastoreService.prepare(query);
entities = pq.asIterable(); 
entityIterator = entities.iterator();
while (entityIterator.hasNext()) {
    entity = entityIterator.next();
    String foundCountry = entity.getKey().getName();
    String foundCapital = (String) entity.getProperty("capital");
    // ... do whatever you do with the data
}

【讨论】:

  • 非常感谢。您已经解释了将实体集合作为单独的实体,而不是与任何实体的关系。从您的示例中,假设我想要拥有属于两个或多个国家的人员的列表。如果我们只有该国的首都,我如何获取人员信息列表。
  • 这……很复杂。在 Datastore 中,每个实体只有一个父级,支持一对多关系。您还需要多对多关系的选项。在一对多系统中对其建模的常用方法是添加第三种实体,其记录链接其他两种实体。我将尝试以这种方式扩展我的第一个示例。
猜你喜欢
  • 2017-10-23
  • 2011-02-27
  • 2013-04-02
  • 2015-04-16
  • 2011-12-29
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多