AzureMobileService:将数据插入 table 时出现异常
AzureMobileService: Insert data in to table gives exception
我刚开始实施 Azure 移动服务。我参考了 Azure 给出的 ToDoItem 的演示。
我以同样的方式为我自己的应用创建了 class 用户。然后我将数据插入 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 是那个领域之一。
我想知道我做错了什么。
查看我下面的用户class:
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();
请帮帮我。
您只需从 user
table 中删除 createdAt
列即可解决此问题。
为什么会出现这个错误:
我不确定但我想这个错误是因为 createdAt
是一个不可为空的成员,你不能让它为空。
编辑:
系统栏的另一个方面是它们不能由客户端发送。对于新的 tables(即具有字符串 ID 的那些),如果更新请求的插入包含以“__”(两个下划线字符)开头的 属性,则请求将被拒绝。然而,'__createdAt' 属性 可以在服务器脚本中设置(尽管如果您真的不希望该列代表对象的创建时间,您可能需要使用另一列为此)——一种可以实现这种(相当奇怪的)场景的方法。如果您尝试更新“__updatedAt”属性,它不会失败,但默认情况下该列由 SQL 触发器更新,因此您对其所做的任何更新都将无论如何都会被覆盖。
“_createdat”列将由 Azure 移动服务自动填充,因此无需将其包含在您的模型中。从用户 class 中删除此 属性。它的存在可能会用空值覆盖自动填充的值。
我刚开始实施 Azure 移动服务。我参考了 Azure 给出的 ToDoItem 的演示。
我以同样的方式为我自己的应用创建了 class 用户。然后我将数据插入 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 是那个领域之一。
我想知道我做错了什么。
查看我下面的用户class:
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();
请帮帮我。
您只需从 user
table 中删除 createdAt
列即可解决此问题。
为什么会出现这个错误:
我不确定但我想这个错误是因为 createdAt
是一个不可为空的成员,你不能让它为空。
编辑:
系统栏的另一个方面是它们不能由客户端发送。对于新的 tables(即具有字符串 ID 的那些),如果更新请求的插入包含以“__”(两个下划线字符)开头的 属性,则请求将被拒绝。然而,'__createdAt' 属性 可以在服务器脚本中设置(尽管如果您真的不希望该列代表对象的创建时间,您可能需要使用另一列为此)——一种可以实现这种(相当奇怪的)场景的方法。如果您尝试更新“__updatedAt”属性,它不会失败,但默认情况下该列由 SQL 触发器更新,因此您对其所做的任何更新都将无论如何都会被覆盖。
“_createdat”列将由 Azure 移动服务自动填充,因此无需将其包含在您的模型中。从用户 class 中删除此 属性。它的存在可能会用空值覆盖自动填充的值。