package com.example.guestbook;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import java.io.IOException;
import java.util.Date;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
Key addTask(String description, DateTime receiveddate) {
Key key = datastore.allocateId(keyFactory.newKey());
Entity task = Entity.newBuilder(key)
.set("description", StringValue.newBuilder(description).
setExcludeFromIndexes(true).build())
.set("receiveddate",(receiveddate))
.set("created", DateTime.now())
.set("done", false)
.build();
datastore.put(task);
return key;
}
void handleCommandLine(String commandLine) {
String[] args = commandLine.split("\\s+");
if (args.length < 1) {
throw new IllegalArgumentException("not enough args");
}
String command = args[0];
switch (command) {
case "new":
args = commandLine.split("\\s+", 3);
if (args.length != 3) {
throw new IllegalArgumentException("missing description");
}
addTask(args[1],DateTime.copyFrom());
System.out.println("task added");
break;
public static void main(String[] args) throws Exception {
TaskList taskList = new TaskList();
System.out.println("Cloud Datastore Task List");
System.out.println();
printUsage();
while (true) {
String commandLine = System.console().readLine("> ");
if (commandLine.trim().isEmpty()) {
break;
}
try {
taskList.handleCommandLine(commandLine);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
printUsage();
}
}
System.out.println("exiting");
System.exit(0);
}
private static void printUsage() {
System.out.println("Usage:");
System.out.println();
System.out.println(" new <description> Adds a task with a description <description>");
System.out.println(" done <task-id> Marks a task as done");
System.out.println(" list Lists all tasks by creation time");
System.out.println(" delete <task-id> Deletes a task");
System.out.println();
}
}
尝试将特定记录的 DateTime 字段插入为 0 或 null 值在使用 Google Cloud Datastore 时,我需要将一些记录插入到数据库中,并将 NULL 作为日期值。我尝试了不同的方法,但它反射(reflect)了插入错误。 /*
As per this link https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/datastore/src/main/java/com/google/datastore/snippets/TaskList.java
最佳答案
自最新编辑以来的更新
(我认为您最新更新中的代码不会编译,但忽略它......:-) )
您确定这些导入正确吗(我指的是 appengine-api-1.0-sdk-1.9.24
的 API)?
您的示例使用:
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
但是您似乎正在编写不同的 API (可能是 low-level external API )。这适用于在 appengine 之外使用,它可能可以工作,但如果您只使用 regular appengine 可能会更容易api 正如我在下面的原始答案中所示(注意我使用的是 setProperty
而不是 set
)。
纵观以上内容,我怀疑在这些行中:
.set("receiveddate",(receiveddate))
.set("created", DateTime.now())
您应该像在这一行中那样使用值(value)生成器:
.set("description", StringValue.newBuilder(description).
我相信您正在使用com.google.cloud.datastore API。尝试使用 NullValue
如下所示:
// beware untested code!
import com.google.cloud.datastore.Datastore;
import com.google.cloud.datastore.DatastoreOptions;
import com.google.cloud.datastore.DateTime;
import com.google.cloud.datastore.Entity;
import com.google.cloud.datastore.KeyFactory;
import com.google.cloud.datastore.NullValue;
Datastore datastore =
DatastoreOptions.getDefaultInstance().getService();
KeyFactory keyFactory = datastore.newKeyFactory().setKind("Dummy");
Entity.Builder entity0 = Entity.newBuilder(keyFactory.newKey("abc"));
DateTime receiveddate = null /* or some other value */;
entity0.set("receiveddate", receiveddate == null ? NullValue.of() : receiveddate);
entity0.set("created", DateTime.now());
原始答案
这似乎有效。只需调用处理程序,然后在数据存储查看器中查看两个实体(在 dev_appserver 上测试):
package com.example.guestbook;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import java.io.IOException;
import java.util.Date;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GuestbookServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity entity0 = new Entity("Dummy", "abc");
entity0.setProperty("created", new Date());
datastore.put(entity0);
Entity entity1 = new Entity("Dummy", "xyz");
entity1.setProperty("created", null);
datastore.put(entity1);
}
}
您正在做的事情有什么根本不同吗?
关于java - 谷歌数据存储使用java插入日期作为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40956678/