我正在尝试将带有 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/