从Xamarin捆绑预先构建的Realm文件

kez*_*kez 7 realm xamarin

我看过一些SO文章,详细介绍了如何将预构建的Realm文件与iOS(Obj-c/swift)和Android(Java)捆绑在一起,但是我找不到任何关于从PCL或共享项目捆绑Xamarin的信息; 这可能吗?

我相信它需要一个每个项目*.realm文件(例如,在编译时从单个源复制),因为文件在每个平台中的分布方式很细微,但这是一个很小的代价,以便能够访问预构建来自两个平台上共享代码的数据.

我的目标是在第一次启动应用程序时避免初始下载过程.

Sus*_*ver 20

您可以将预先填充的.realm数据库作为资源(BundleResourceBuild Action)添加到应用程序iOS包中,并将其作为Android Asset目录的原始资产(AndroidAssetBuild Action)添加.

使用Realm中Xamarin.Forms基于日期的Journal示例,您可以将填充的数据库作为链接项添加到每个本机项目,并在应用程序启动时复制它.

例:

在你的iOS的"原生"项目Xamarin.Form的解决方案/应用程序,更新的FinishedLaunching方法来复制您的预填充数据库,如果用户数据库不存在(即这是第一次应用程序运行):

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    var prepopulated = "prepopulated.realm";
    var realmDB = "journal.realm";
    var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    if (!File.Exists(Path.Combine(documentsPath, realmDB)))
    {
        File.Copy(prepopulated, Path.Combine(documentsPath, realmDB));
    }
    global::Xamarin.Forms.Forms.Init();
    LoadApplication(new App());
    return base.FinishedLaunching(app, options);
}
Run Code Online (Sandbox Code Playgroud)

注意:您可以在其他"本机"项目中使用相同的技术

注意:自定义编写的Xamarin.Forms依赖服务是以这种方式执行的替代方法,但结果是相同的

由于我们正在复制应用程序文档目录中的prepopulated.realmto journal.realm,我们可以告诉Realm打开此数据库而不是创建/使用一个数据库default.realm.

Xamarin.FormJournal项目中JournalEntriesViewModel.cs,更新代码以打开它journal.realm

public JournalEntriesViewModel()
{
    _realm = Realm.GetInstance("journal.realm");
    Entries = _realm.All<JournalEntry>();
    AddEntryCommand = new Command(AddEntry);
    DeleteEntryCommand = new Command<JournalEntry>(DeleteEntry);
}
Run Code Online (Sandbox Code Playgroud)

解决方案中的相同预先填充的数据库链接到不同的"本机"项目:

在此输入图像描述