AzureMobileService:将数据插入到表中会产生异常

时间:2015-07-22 08:31:07

标签: java android azure azure-mobile-services azure-storage-blobs

我是新手来实施Azure移动服务。我已经参考了Azure提供的ToDoItem演示。

以同样的方式,我为自己的应用程序制作了类User。然后我将数据插入到MobileServiceTable中,但它给出了如下错误:

{"message":"The operation failed with the following error: 'A null store-generated value was returned for a non-nullable member 'CreatedAt' of type 'CrazyLabApp.Models.User'.'."}

我没有创建任何这样的字段,因为它不是在ToDoItem演示中创建的。我已经看到MobileServiceTable创建了4个默认字段。 createdAt是其中一个领域。

我很想知道我做错了什么。

检查我的以下用户类:

   public class User {
    @com.google.gson.annotations.SerializedName("id")
    private String ServiceUserId;

    @com.google.gson.annotations.SerializedName("email")
    private String Email;

    @com.google.gson.annotations.SerializedName("firstname")
    private String FirstName;

    @com.google.gson.annotations.SerializedName("lastname")
    private String LastName;

    @com.google.gson.annotations.SerializedName("profilepic")
    private String ProfilePic;

    @com.google.gson.annotations.SerializedName("introduction")
    private String Introduction;

    @com.google.gson.annotations.SerializedName("website")
    private String Website;

    @com.google.gson.annotations.SerializedName("title")
    private String Title;

    @com.google.gson.annotations.SerializedName("_createdAt")
    private Date CreatedAt;

    @com.google.gson.annotations.SerializedName("coverimage")
    private ArrayList<CoverImage> CoverImages;

    /*public Date getCreatedAt() {
        return CreatedAt;
    }

    public void setCreatedAt(Date createdAt) {
        CreatedAt = createdAt;
    }*/

    @com.google.gson.annotations.SerializedName("followers")
    private ArrayList<User> Followers;

    @com.google.gson.annotations.SerializedName("likes")
    private ArrayList<Likes> Likes;

    @com.google.gson.annotations.SerializedName("collections")
    private ArrayList<Collections> Collections;

    @com.google.gson.annotations.SerializedName("comments")
    private ArrayList<Comments> Comments;

    @com.google.gson.annotations.SerializedName("stories")
    private ArrayList<Story> Stories ;




    //-------------- Methods
    public ArrayList<Story> getStories() {
        return Stories;
    }

    public void setStories(ArrayList<Story> stories) {
        Stories = stories;
    }

    public ArrayList<com.promact.crazylab.model.Comments> getComments() {
        return Comments;
    }

    public void setComments(ArrayList<com.promact.crazylab.model.Comments> comments) {
        Comments = comments;
    }

    public ArrayList<com.promact.crazylab.model.Collections> getCollections() {
        return Collections;
    }

    public void setCollections(ArrayList<com.promact.crazylab.model.Collections> collections) {
        Collections = collections;
    }

    public ArrayList<com.promact.crazylab.model.Likes> getLikes() {
        return Likes;
    }

    public void setLikes(ArrayList<com.promact.crazylab.model.Likes> likes) {
        Likes = likes;
    }

    public ArrayList<User> getFollowers() {
        return Followers;
    }

    public void setFollowers(ArrayList<User> followers) {
        Followers = followers;
    }

    public ArrayList<CoverImage> getCoverImages() {
        return CoverImages;
    }

    public void setCoverImages(ArrayList<CoverImage> coverImages) {
        CoverImages = coverImages;
    }

    public String getTitle() {
        return Title;
    }

    public void setTitle(String title) {
        Title = title;
    }

    public String getWebsite() {
        return Website;
    }

    public void setWebsite(String website) {
        Website = website;
    }

    public String getIntroduction() {
        return Introduction;
    }

    public void setIntroduction(String introduction) {
        Introduction = introduction;
    }

    public String getLastName() {
        return LastName;
    }

    public void setLastName(String lastName) {
        LastName = lastName;
    }

    public String getProfilePic() {
        return ProfilePic;
    }

    public void setProfilePic(String profilePic) {
        ProfilePic = profilePic;
    }

    public String getEmail() {
        return Email;
    }

    public void setEmail(String email) {
        Email = email;
    }

    public String getFirstName() {
        return FirstName;
    }

    public void setFirstName(String firstName) {
        FirstName = firstName;
    }

    public String getServiceUserId() {
        return ServiceUserId;
    }

    public void setServiceUserId(String serviceUserId) {
        ServiceUserId = serviceUserId;
    }

    @Override
    public boolean equals(Object o) {
        return o instanceof User && ((User) o).ServiceUserId == ServiceUserId;
    }

}

还要按照我插入的方式检查以下代码:

final User u = new User();
u.setFirstName(mName);
u.setEmail(mEmail);
u.setProfilePic(mUrl);

mUserTable = mClient.getTable(User.class);

             // Insert the new item
             new AsyncTask<Void, Void, Void>(){
             @Override
             protected Void doInBackground(Void... params) {
                    try {
                           final User entity = mUserTable.insert(u).get();

                     } catch (Exception e){
                        //createAndShowDialog(e, "Error");
                        System.out.println("Error: "+e.toString());

                     }
             return null;
             }
     }.execute();

请帮助我。

2 个答案:

答案 0 :(得分:2)

Azure移动服务将自动填充“_createdat”列,因此无需将其包含在模型中。从User类中删除此属性。它的存在可能会用null覆盖自动填充的值。

答案 1 :(得分:1)

您只需从azure中的createdAt表中删除user列即可解决此问题。

为什么会出现此错误:

我不确定但我猜这个错误即将发生,因为createdAt是一个不可为空的成员,你不能把它留空。

编辑:

系统列的另一个方面是客户端无法发送它们。对于新表(即具有字符串ID的表),如果更新请求的插入包含以“__”(两个下划线字符)开头的属性,则该请求将被拒绝。但是,'__ createAt'属性可以在服务器脚本中设置(尽管如果你真的不希望该列表示对象的创建时间,你可能想要使用另一列) - 这是一种方法(相当离奇)场景可以完成。如果您尝试更新'__updatedAt'属性,它将不会失败,但默认情况下该列由SQL触发器更新,因此您对其所做的任何更新都将被覆盖。

了解更多信息,请点击此处: - http://blogs.msdn.com/b/carlosfigueira/archive/2013/11/23/new-tables-in-azure-mobile-services-string-id-system-properties-and-optimistic-concurrency.aspx