如何支持与Azure移动服务Android的一对多关系

如何支持与Azure移动服务Android的一对多关系,android,one-to-many,azure-mobile-services,Android,One To Many,Azure Mobile Services,我最近才开始使用Azure移动服务。我正在建立我的数据库。然而,我不确定我将如何处理一对多/多对多关系。Azure Mobile对此没有现成的支持,因此我不确定还能做什么。一种方法是将外键id存储在特定实体中,然后在该表上运行查询,以获取与特定id匹配的所有项。我认为这可能有点太耗时了。不确定。关于如何做到这一点的任何建议或见解。 我是否需要借助JavaScript在后端创建某种形式的逻辑来创建服务器端的实际关系?使用AMS for Android支持一对多关系的一种方法是创建ArrayList

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

使用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;
}
}
公共类CollectionSerializer实现JsonSerializer,
JsonDeserializer{
公共JsonElement序列化(集合,类型,
JsonSerializationContext(上下文){
JsonArray结果=新的JsonArray();
用于(E项:收集){
add(context.serialize(item));
}
返回新的JsonPrimitive(result.toString());
}
@抑制警告(“未选中”)
公共集合反序列化(JsonElement元素,类型,
JsonDeserializationContext)抛出JsonParseException{
JsonArray items=(JsonArray)新的JsonParser().parse(element.getAsString());
ParameteredType反序列化集合=((ParameteredType)类型);
类型collectionItemType=deserializationCollection.getActualTypeArguments()[0];
集合列表=空;
试一试{
list=(Collection)((Class)反序列化Collection.getRawType()).newInstance();
对于(JsonElement e:项目){
添加((E)context.deserialize(E,collectionItemType));
}
}捕获(实例化异常e){
抛出新的JsonParseException(e);
}捕获(非法访问例外e){
抛出新的JsonParseException(e);
}
退货清单;
}
}
完成后,将其添加到您创建的MobileServiceClient实例中

 mClient.registerSerializer(ArrayList.class,new CollectionSerializer<Object>());
mClient.registerSerializer(ArrayList.class,new CollectionSerializer());

使用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;
}
}
公共类CollectionSerializer实现JsonSerializer,
JsonDeserializer{
公共JsonElement序列化(集合,类型,
JsonSerializationContext(上下文){
JsonArray结果=新的JsonArray();
用于(E项:收集){
add(context.serialize(item));
}
返回新的JsonPrimitive(result.toString());
}
@抑制警告(“未选中”)
公共集合反序列化(JsonElement元素,类型,
JsonDeserializationContext)抛出JsonParseException{
JsonArray items=(JsonArray)新的JsonParser().parse(element.getAsString());
ParameteredType反序列化集合=((ParameteredType)类型);
类型collectionItemType=deserializationCollection.getActualTypeArguments()[0];
集合列表=空;
试一试{
list=(Collection)((Class)反序列化Collection.getRawType()).newInstance();
对于(JsonElement e:项目){
添加((E)context.deserialize(E,collectionItemType));
}
}捕获(实例化异常e){
抛出新的JsonParseException(e);
}捕获(非法访问例外e){
抛出新的JsonParseException(e);
}
退货清单;
}
}
完成后,将其添加到您创建的MobileServiceClient实例中

 mClient.registerSerializer(ArrayList.class,new CollectionSerializer<Object>());
mClient.registerSerializer(ArrayList.class,new CollectionSerializer());

Joel提到的另一种方法是,您可以在客户端建立“常规”关系,然后在将它们插入服务器之前,将它们(不仅是键,而且是整个值)反规范化。上的帖子展示了一些可以做到这一点的方法。

Joel提到的另一种方法是,您可以在客户端建立“常规”关系,然后在将它们插入服务器之前,将它们(不仅是键,而且是整个值)反规范化。上的帖子展示了一些可以做到这一点的方法。

非常感谢您提供的解决方案。我要用这个来代替:)非常感谢这个解决方案。我要用这个来代替:)