xamarin - 是否有任何直接的方法可以从 JSON 填充和更新 Realm-Xamarin?

标签 xamarin realm

我正在尝试将带有 Realm 的 Android 应用程序移植到 Xamarin,以便它也可用于 iOS 设备。在 Android 中,我有几个 JSON 文件,其中包含一些必要的初始数据,例如cities.json,我在开头导入它 realm.createOrUpdateAllFromJson(Class<E> clazz, InputStream in)方法,像这样:

private void loadInitialCities(Realm realm) {
    InputStream stream = context.getAssets().open("data/cities.json");
    realm.createOrUpdateAllFromJson(City.class, stream);
}

我还发现此方法在以 JSON 形式从 Web 服务检索数据时非常有用。

现在,在 Xamarin 中,我没有看到任何与此类方法等效的方法。有什么方法可以实现这一点吗?或者至少有一个在 C# 中从 JSON 创建 RealmObject 的解决方法/工具?

最佳答案

我为此编写了自己的扩展方法(是的,我也想念内置的帮助器方法)。

这是我如何做到这一点的基本示例:

JSON 模型:

[
    {
        "name": "Alabama",
        "abbreviation": "AL"
    },
    {
        "name": "Alaska",
        "abbreviation": "AK"
    },
    ~~~~
]

Realm 模型:

public class State : RealmObject
{
    public string name { get; set; }
    public string abbreviation { get; set; }
}

Xamarin.Android 资源和 Newtonsoft 流式阅读器:

var config = RealmConfiguration.DefaultConfiguration;
config.SchemaVersion = 1;
using (var theRealm = Realm.GetInstance("StackOverflow.realm"))
using (var assetStream = Assets.Open("States.json"))
using (var streamReader = new StreamReader(assetStream))
using (var jsonTextReader = new JsonTextReader(streamReader))
{
    var serializer = new JsonSerializer();
    if (!jsonTextReader.Read() || jsonTextReader.TokenType != JsonToken.StartArray)
        throw new Exception("Bad Json, start of array missing");
    while (jsonTextReader.Read())
    {
        if (jsonTextReader.TokenType == JsonToken.EndArray)
            break;
        var state = serializer.Deserialize<State>(jsonTextReader);
        theRealm.Write(() =>
        {
            var realmState = theRealm.CreateObject<State>();
            realmState.abbreviation = state.abbreviation;
            realmState.name = state.name;
        });
    }
}

更新:我的扩展方法之一:

扩展方法用法:

using (var theRealm = Realm.GetInstance("StackOverflow.realm"))
using (var assetStream = Assets.Open("States.json"))
{
    theRealm.JsonArrayToRealm<State>(assetStream);
}

扩展方法:

注意:这使用AutoMapper复制RealmObject并避免反射,也使用Newtonsoft.Json

public static class RealmDoesJson
{
    public static void JsonArrayToRealm<T>(this Realm realm, Stream stream) where T : RealmObject
    {
        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<T, T>();
        });
        using (var streamReader = new StreamReader(stream))
        using (var jsonTextReader = new JsonTextReader(streamReader))
        {
            var serializer = new JsonSerializer();
            if (!jsonTextReader.Read() || jsonTextReader.TokenType != JsonToken.StartArray)
                throw new Exception("MALFORMED JSON, Start of Array missing");
            while (jsonTextReader.Read())
            {
                if (jsonTextReader.TokenType == JsonToken.EndArray)
                    break;
                var jsonObject = serializer.Deserialize<T>(jsonTextReader);
                realm.Write(() => // inside while loop / single object transaction for memory manangement reasons...
                {
                    var realmObject = realm.CreateObject(typeof(T).Name);
                    Mapper.Map<T, T>(jsonObject, realmObject);
                });
            }
        }
    }
}

关于xamarin - 是否有任何直接的方法可以从 JSON 填充和更新 Realm-Xamarin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40270544/

相关文章:

c# - 无法在 Xamarin.Forms 中实现导航

c# - 使用 Xamarin 构建 jar 库

Xamarin 示例项目未在 Visual Studio 中加载

android - OkBuck 和 Realm 的问题

swift - 按 Swift 3 部分的字母顺序对 tableView 中的 Realm 数据进行排序

ios - Realm 模型包含属性但在运行时未找到它

c# - Xamarin Forms 状态容器 View 不考虑布局选项

build - 在Xamarin Studio中更改build设置,以使丢失的引用不会被解释为错误

ios - 检查 Realm 对象是否被删除

swift - 尝试执行 Realm 迁移时获取无效的属性名称