- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我asked question在询问是否可以使用 Java 将复杂的类组合保存到 Google AppEngine 内的 Google Datastore 之前,但我不够清楚,也懒得发布我的所有类,但经过很多小时的挣扎后,我开始放弃。所以这里是代码的更详细问题。
我知道这种东西应该可以正常工作,但由于某种未知的原因,我无法正常工作。问题是,当我保存对象并关闭数据库连接然后再次打开它时,该对象中的数据为空。该对象位于数据库中,当我选择该对象的 ID 时我可以看到它,但其他所有内容都是空白的。不幸的是,Google 没有数据库查看器来查看该数据库中的内容。我尝试搜索并 ask但没有运气。 (有 one 但它是 not working on my computer )那么,我们开始吧:
内容
// imports...
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Content{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String id;
@Persistent protected String title;
@Persistent protected String thumbnailURL;
@Persistent protected List<Rating> ratings;
@Persistent protected List<Tag> tags;
@Persistent protected Double price;
@Persistent protected User owner;
// constructor and getters+setters
}
类(class)
// imports...
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Course extends Content{
@Persistent private Video video;
@Persistent private Document document;
@Persistent private String notes;
@Persistent private String summary;
// constructor and getters+setters
public String toString(){
return "ID: " + this.getId() + " Title: "+this.getTitle()+", Price: "+this.getPrice()+", No. of Tags: "+this.getTags().size();
}
}
视频
// imports...
public class Video extends Content {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
String id;
@Persistent String fileUrl;
// constructor and getters+setters
}
文档
// imports...
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Document extends Content /*AthenaObject*/ {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String id;
@Persistent private String docUrl;
// constructor and getters+setters
}
标签
// imports...
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Tag{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String id;
@Persistent private String tagText;
// constructor and getters+setters
}
用于保存数据并从数据存储区获取数据的代码:
public Boolean testCourse(){
Boolean isSaved = false;
PersistenceManager pm = PMF.get().getPersistenceManager();
Course c = new Course();
try{
List<Tag> tags = new ArrayList<Tag>();
tags.add(new Tag("tag1"));
tags.add(new Tag("tag2"));
tags.add(new Tag("tag3"));
c.setTitle("Course Title - " + new Date().getTime());
c.setPrice(99.90);
c.setTags(tags);
System.out.println(c.toString()); // **Output:** ID: null Title: Course Title - 1247116147858, Price: 99.9, No. of Tags: 3
pm.makePersistent(c);
Course cAfter = pm.getObjectById(Course.class, KeyFactory.stringToKey(c.getId()));
System.out.println(cAfter.toString()); // **Output:** agptYRtzaWL4gZDb3Vy4ErYFgw Title: Course Title - 1247116147858, Price: 99.9, No. of Tags: 3
isSaved = true;
}
catch(Exception e){
e.printStackTrace();
isSaved = false;
}
finally{
pm.close();
}
pm = PMF.get().getPersistenceManager();
try{
Course cAfterClose = pm.getObjectById(Course.class, KeyFactory.stringToKey(c.getId()));
System.out.println(cAfterClose.toString()); // **Error**: See below
}
catch(Exception e){e.printStackTrace();}
finally{pm.close();}
return isSaved;
}
这是输出:
ID: nullTitle: Course Title - 1247117389679, Price: 99.9, No. of Tags: 3 ID: agptYWtzaW1zYXBwcgwLEgZDb3Vyc2UYGAwTitle: Course Title - 1247117389679, Price: 99.9, No. of Tags: 3 java.lang.NullPointerException at com.athena.server.entity.Course.toString(Course.java:94) at com.athena.server.CourseServiceImpl.testCourse(CourseServiceImpl.java:146) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166) at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86) at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at org.mortbay.jetty.Server.handle(Server.java:313) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396) at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
我知道这个错误意味着字符串为空。但记录在数据库中。并且应该坚持下去。为什么数据为空???
有什么建议为什么会发生在我身上吗?
最佳答案
我不知道到底是什么导致了您的错误,但您可以尝试执行以下几个步骤来帮助排除故障:
首先,尝试将问题范围缩小到尽可能小的测试用例。您在上面发布了很多类(class),并且很可能仅使用其中的 2 个或 3 个类(class)即可重复此问题。
其次,如果您确实想准确查看实体在数据存储区中的样子,则必须执行类似的操作(或者您可以尝试将应用程序上传到 appengine 并在那里运行,这样您就可以使用他们的数据查看器):
Query q = pm.newQuery(Course.class);
List<Course> list = (List<Course>) q.execute();
for(Course c: list){
System.out.println("Course id:" + c.getId());
System.out.println("Course title:" + c.getTitle());
//...
}
关于java - 从 Google Datastore 获取对象后,该对象为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1101980/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!