java - 谷歌数据存储使用java插入日期作为空值

标签 java google-app-engine google-cloud-datastore

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/

相关文章:

Java Mission Control 空插件列表

google-app-engine - Google App Engine NDB 创建 __metadata__ 属性

google-app-engine - 如何读取 _pre_put_hook 中的旧属性值

java - 数据存储和index.yaml : no matching index found

java - 如何将文本输出写入文件?

java - 从具有多个变量的方法返回值

java - 限制 Rest Template 每分钟调用的电话数

java - GAE/GWT 服务器端数据在实例之间不一致/不持久

java - Eclipse 启动失败谷歌插件

google-app-engine - 如何使用 AppEngine 和 Datastore 生成大文件(PDF 和 CSV)?