1

我最近才开始使用 Azure 移动服务。我正在设置我的数据库。但是我不确定我将如何处理一对多/多对多的关系。Azure Mobile 对此没有开箱即用的支持,所以我不确定还能做什么。一种方法是将外键 id 存储在特定实体中,然后对该表运行查询以获取与特定 id 匹配的所有项目。我认为这可能有点太耗时了。没有把握。关于如何做到这一点的任何建议或见解。我是否必须求助于使用 JavaScript 在后端创建某种形式的逻辑来在服务器端创建实际关系?

4

2 回答 2

2

Joel 提到的另一种方法是,您可以在客户端拥有“常规”关系,然后在将它们插入服务器之前对它们进行非规范化 - 不仅是键,还有整个值。http://blogs.msdn.com/b/carlosfigueira/archive/2013/08/29/complex-types-and-azure-mobile-services-android-version.aspx上的帖子显示了一些可以做到这一点的方法.

于 2013-08-29T18:54:11.177 回答
2

使用 AMS for Android 支持一对多关系的一种方法是创建一个 ArrayList 并将外键/id 存储在特定表中。然后,该 ArrayList 包含您要检索的相关实体的 ID,因此您所要做的就是检索数组并提取 ID。AWS 目前不支持 ArrayList 的序列化和反序列化,因此您必须编写自定义序列化程序来实现这一点。这可以通过使用 GSON 来完成。这是一个例子。

public class CollectionSerializer<E> implements JsonSerializer<Collection<E>>,
    JsonDeserializer<Collection<E>> {

public JsonElement serialize(Collection<E> collection, Type type,
                             JsonSerializationContext context) {
    JsonArray result = new JsonArray();
    for(E item : collection){
        result.add(context.serialize(item));

    }

    return new JsonPrimitive(result.toString());
}


@SuppressWarnings("unchecked")
public Collection deserialize(JsonElement element, Type type,
                              JsonDeserializationContext context) throws JsonParseException {
    JsonArray items = (JsonArray) new JsonParser().parse(element.getAsString());
    ParameterizedType deserializationCollection = ((ParameterizedType) type);
    Type collectionItemType = deserializationCollection.getActualTypeArguments()[0];
    Collection list = null;

    try {
        list = (Collection)((Class<?>) deserializationCollection.getRawType()).newInstance();
        for(JsonElement e : items){
            list.add((E)context.deserialize(e, collectionItemType));
        }
    } catch (InstantiationException e) {
        throw new JsonParseException(e);
    } catch (IllegalAccessException e) {
        throw new JsonParseException(e);
    }

    return list;
}
}

完成后,您将其添加到您创建的 MobileServiceClient 实例中。

 mClient.registerSerializer(ArrayList.class,new CollectionSerializer<Object>());
于 2013-08-28T03:41:40.607 回答