Google app engine 数据存储ID Google appengine使用负整数,具体为-1
对于我的应用程序,id为-1似乎有问题。应用程序 使用此ID几个月没有出现问题。(我有一代人 从零到无穷大的整数——从Google开始,我将零映射到-1 Appengine不接受ID为零。) 下面的程序只是创建一个新实体 存储它,然后尝试检索它 日志消息显示:Google app engine 数据存储ID Google appengine使用负整数,具体为-1,google-app-engine,Google App Engine,对于我的应用程序,id为-1似乎有问题。应用程序 使用此ID几个月没有出现问题。(我有一代人 从零到无穷大的整数——从Google开始,我将零映射到-1 Appengine不接受ID为零。) 下面的程序只是创建一个新实体 存储它,然后尝试检索它 日志消息显示: TE doGet: finished putting item TE doGet: debug Entity Failed on -1|Key|generation(-1)| 数据存储查看器向我显示两个类型为“GEN”的实体 一个是id
TE doGet: finished putting item
TE doGet: debug Entity Failed on -1|Key|generation(-1)|
数据存储查看器向我显示两个类型为“GEN”的实体
一个是id=1,另一个是id=10001。
当我点击“id=1”时,它显示我
解码的实体键:gen:id=-1>gen-id=1
两个id都是链接。当我点击“id=-1”时,它会说
这个实体不存在
当我点击“GEN:id=1”时,它会为我提供我在其中输入的信息
节目
--导入和抑制已删除的警告以节省空间
public class TE extends HttpServlet{
private ExperimentUtil eUtil = new ExperimentUtil();
private static final Logger log = Logger.getLogger(
StatusServlet.class.getName());
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
long DMyGen = -1;
Key k = KeyFactory.createKey("gen",-1);
PrintWriter out = resp.getWriter();
Entity a;
a = new Entity("GEN",k);
datastore.put(a);
log.info("finished putting item");
out.println("finished putting item");
k = KeyFactory.createKey("generation",DMyGen);
try {
com.google.appengine.api.datastore.Entity e = datastore.get(k);
log.info("debug entity get succeeded");
out.println("debug entity get succeeded");
}
catch (EntityNotFoundException e) {
log.severe ("debug Entity Failed on "+DMyGen + "|Key|"+k+"|");
}
out.println ("TE finished!");
return;
}
}
谢谢你对这个问题的善意和博学的评论。你们很多人问
为什么会使用否定ID。这当然是一个合理的问题。
我的参与式民主应用程序记录了预算的代数
从零到N的提案。谷歌appengine不接受零的ID。
因此,我加入了一个映射函数,该函数将零映射到-1,并保留其他id
单独地这一点我已改为只添加一个
应用程序运行得更好。我做了一个新的测试。这是新的
二者的版本
程序。如显示的内容所示,这两项都已成功完成
在浏览器上
但是,我在数据存储查看器上看到奇怪的结果
编辑实体:Gen
Decoded entity key: gen: id=4 > GHen: id=10001
(我还用DMyGen=4运行了这个,以及
(她五岁。)
--再次编辑导入语句以节省空间
public class TE extends HttpServlet{
private ExperimentUtil eUtil = new ExperimentUtil();
private static final Logger log = Logger.getLogger(StatusServlet.class.getName());
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
long DMyGen = 5;
Key k = KeyFactory.createKey("gen",DMyGen);
PrintWriter out = resp.getWriter();
Entity a;
a = new Entity("GEN",k);
datastore.put(a);
log.info("finished putting item");
out.println("finished putting item");
k = KeyFactory.createKey("gen",DMyGen);
try {
com.google.appengine.api.datastore.Entity e = datastore.get(k);
log.info("debug entity get succeeded");
out.println("debug entity get succeeded");
}
catch (EntityNotFoundException e) {
log.severe ("debug Entity Failed on "+DMyGen + "|Key|"+k+"|");
}
---****--第二次测试,以查看发电机
public class Te extends HttpServlet{
private ExperimentUtil eUtil = new ExperimentUtil();
private static final Logger log = Logger.getLogger(StatusServlet.class.getName());
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Key k;
long DMyGen = 5;
k = KeyFactory.createKey("gen",DMyGen);
PrintWriter out;
out = resp.getWriter();
try {
com.google.appengine.api.datastore.Entity e = datastore.get(k);
log.info("debug entity get succeeded"+e);
out.println("debug entity get succeeded");
}
catch (EntityNotFoundException e) {
log.severe ("debug Entity Failed on "+DMyGen + "|Key|"+k+"|");
}
是的,我记得我无法用一个负ID保存实体这更像是一个bug报告而不是请求帮助,不是吗?我只是好奇:为什么一开始就使用否定标识符?在我的例子中,它是第三方ID,用于引用,我只是将它们存储为字符串。我对这个第三方系统的作者也有同样的问题:)注意——我更新了文档,以反映我在讨论和当前问题的基础上所做的更改。