我最近才开始使用 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;
}
}
完成后,将其添加到您创建的 MobileServiceClient 实例中。
mClient.registerSerializer(ArrayList.class,new CollectionSerializer<Object>());
关于android - 如何支持与 Azure 移动服务 Android 的一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18425789/