继承的类不会存储在Windows Azure Mobile Service中

时间:2014-03-01 16:13:30

标签: java android azure azure-mobile-services

我正在为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在两种情况下完全相同。我做错了什么?

1 个答案:

答案 0 :(得分:0)

经过几天的调试,我提出了一个潜在的问题,这是一个明确的解决方案。这对于撰写本文时有效的Android Azure SDK有效。几个笔记:

  1. 对于无缝事务,id成员必须存在于继承的类中,而不是超类。在验证对象时,Azure SDK使用反射并尝试查找名称(或序列化名称)等于idId的字段。不知何故,如果成员出现在超级课程中,我们就会发现错误。

  2. GSON(将Java对象序列化为JSON的东西)在SDK中配置,以便它甚至序列化为null成员。因此,当WAMS表(新表)中没有列并尝试插入具有空字段的项时,将引发错误。该字段必须保持一个值,以便可以确定要生成的相应列的类型。具有空值的新字段将给您一个错误。

  3. 这是一个放在新桌子中的项目示例。

    {
        "id": "Awesome unique id",
        "name": Beautiful Wallpaper",
        "description": null
    }
    

    在这里,WAMS会知道它必须生成一个名为description的列;但是,它不知道该列的类型。因此,第一个对象必须始终具有非空值。

    在我的特殊情况下,两个问题都存在。照顾这些事情解决了他们。