存储和搜索appengine数据存储区上的键和值对

时间:2013-12-31 05:55:14

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

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

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

(或)

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

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

我还希望按用户指定的键和值对进行搜索,以获取父实体。搜索也可以有多个键和值对。

请帮我做。

1 个答案:

答案 0 :(得分:2)

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

当您接受建议时,如何使用数据存储区低级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
}