我想在另一个模型中的Google Datastore实体上存储多个自定义键和值对作为子实体。我发现有两种方法可以做到这一点
HashMap<String, String> map = new HashMap<String, String>()
(或)
List<KeyValuePair> pairs = new ArrayList<KeyValuePair>()
我真的不知道哪种方法正确。
我还希望按用户指定的键和值对进行搜索,以获取父实体。搜索也可以有多个键和值对。
请帮我做。
答案 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
}