我正在为Windows Azure创建库。因此,这是一个插入新记录的简单通用方法:
public <TEntity extends SyncableBase> void addRemoteItem(TEntity itemToAdd) {
MobileServiceTable<TEntity> remoteTable = (MobileServiceTable<TEntity>)mobileServiceClient.getTable(itemToAdd.getClass());
Gson gson = new Gson();
String json = gson.toJson(itemToAdd);
remoteTable.insert(itemToAdd, new TableOperationCallback<TEntity>() {
public void onCompleted(TEntity entity, Exception exception, ServiceFilterResponse response) {
if (exception == null) {
Log.e("SuccessMe", "Success");
// Insert succeeded
}
else {
Log.e("SuccessMe", "Nah "+ exception.getMessage());
// Insert failed
}
}
});
}
现在,这是我的SyncableBase类:
public class SyncableBase {
@SerializedName("Bingo")
private int localId;
//@SerializedName("id")
private String remoteId;
private boolean isDeleted;
}
我的ToDoItem课程:
public class ToDoItem extends SyncableBase {
private String name;
}
现在,问题是:Error processing request
失败了。但是如果我不从ToDoItem
扩展SyncableBase
并将所有这些成员直接移到前者,那么一切正常。可以看出,我在调用inset之前尝试序列化我的Java对象。序列化的json在两种情况下完全相同。我做错了什么?
答案 0 :(得分:0)
经过几天的调试,我提出了一个潜在的问题,这是一个明确的解决方案。这对于撰写本文时有效的Android Azure SDK有效。几个笔记:
对于无缝事务,id
成员必须存在于继承的类中,而不是超类。在验证对象时,Azure SDK使用反射并尝试查找名称(或序列化名称)等于id
或Id
的字段。不知何故,如果成员出现在超级课程中,我们就会发现错误。
GSON(将Java对象序列化为JSON的东西)在SDK中配置,以便它甚至序列化为null成员。因此,当WAMS表(新表)中没有列并尝试插入具有空字段的项时,将引发错误。该字段必须保持一个值,以便可以确定要生成的相应列的类型。具有空值的新字段将给您一个错误。
这是一个放在新桌子中的项目示例。
{
"id": "Awesome unique id",
"name": Beautiful Wallpaper",
"description": null
}
在这里,WAMS会知道它必须生成一个名为description
的列;但是,它不知道该列的类型。因此,第一个对象必须始终具有非空值。
在我的特殊情况下,两个问题都存在。照顾这些事情解决了他们。