Пакет готовых файлов Realm из Xamarin

Я видел несколько постов SO, в которых подробно рассказывается, как связывать предварительно собранные файлы Realm с iOS (Obj-c / swift) и Android (Java), но я не могу найти никакой информации о связывании с Xamarin из PCL или общего проекта; Это возможно?

Я полагаю, что для этого потребуется файл * .realm для каждого проекта (например, скопированный из одного источника во время компиляции) из-за нюансов того, как файлы распределяются на каждой платформе, но это небольшая цена, чтобы иметь доступ к предварительно собранным данные из общего кода на обеих платформах.

Моя цель - избежать начального процесса загрузки при первом запуске приложения.

Ответы на вопрос(3)

Решение Вопроса

.realm база данных для вашего приложения iOS комплект в качестве ресурса (BundleResource Build Action) и в качестве необработанного ресурса для вашего каталога активов Android (AndroidAsset Build Action).

С использованиемXamarin.Forms-основанжурнал Например, из Realm вы можете добавить свою заполненную базу данных в виде связанного элемента в каждый собственный проект и скопировать его при запуске приложения.

Пример:

В 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);
}

Примечание: ту же технику можно использовать в других ваших «нативных» проектах

Примечание: заказнойXamarin.Forms Служба зависимостей - альтернатива этому, но результаты такие же

Так как мы копируемprepopulated.realm вjournal.realm в каталоге документов приложения мы можем сказать Realm открыть эту базу данных вместо создания / использованияdefault.realm один.

вXamarin.Form Журнал проектаJournalEntriesViewModel.cs, обновите код, чтобы открыть этоjournal.realm

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

Одна и та же предварительно заполненная база данных в решении, связанная с различными «нативными» проектами:

 kez30 мая 2016 г., 13:06
Спасибо @SushiHangover, это фантастика. Я все еще на стадии планирования, но я принимаю это решение!
 SushiHangover08 февр. 2017 г., 15:49
@ E.Freitas Какая проблема у тебя на Android?
 SushiHangover29 мая 2016 г., 11:38
@AndyDent Спасибо. Пока любяRealm Xamarin, классная работа !!! Используется только Realm в одном большом / производствоSwiftпроект, основанный на этом, но он был удивительным, а производительность запросов по сравнению с SQLite сделала это приложение блестящим. Я буду танцевать веселье, еслиAkavache получает работающий провайдер Realm IOgithub.com/akavache/Akavache/pull/292
 Dr. Atul Tiwari21 окт. 2016 г., 17:17
@SushiHangover Спасибо за ваш подробный ответ. К сожалению, сегодня у меня третий день только на всех 3 - Mac, Realm и Xamarin. Итак, я все еще выясняю, что будет правильным местом для размещения этого кода. Поэтому я прошу вас поделиться ссылкой GitHub с вашим демонстрационным проектом, это было бы очень полезно.
 Andy Dent29 мая 2016 г., 11:20
Спасибо за отличный пример, включая скриншоты! (Я один из авторов Царства Ксамарина).
 E.Freitas08 февр. 2017 г., 15:41
Это работает очень хорошо для iOS, однако пробовать то же самое в Android не работает. Не могли бы вы подробно описать метод, используемый для Android? Строка «Примечание: ту же технику можно использовать в других ваших« нативных »проектах» вводит в заблуждение.
 E.Freitas14 февр. 2017 г., 20:04
Я смог прочитать файл области на Android, сначала поместив файл populated.realm в папку ресурсов PCL, пометив его как встроенный ресурс, а затем загрузив его с кодом из этого ответа:stackoverflow.com/a/10412442/466197, Затем я смог сохранить его как файл «default.realm» с помощьюFile.WriteAllBytes(documentsPath, realmDB); вместоFile.Copy(prepopulated, Path.Combine(documentsPath, realmDB));.
 Andy Dent04 июн. 2016 г., 04:43
С радостью сообщаем, что теперь мы ссылаемся на этот ответ как на «официальный» документ поrealm.io/docs/xamarin/0.75.0/#bundling-realm-files

кто хочет связать файл области на родном Xamarin.Android, вы можете использовать следующий код. Файл в комплекте области может иметь то же имя, что и конечный файл области. Просто скопируйте файл области в каталог Assets и убедитесь, что действие по сборке установлено как AndroidAsset.

var realmDB = "somerealm.realm";
var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
var filePath = Path.Combine(documentsPath, realmDB);
if (!File.Exists(filePath))
{
    using (var asset = Assets.Open(realmDB))
    using (var destination = File.OpenWrite(filePath))
    {
        asset.CopyTo(destination);
    }
}

в отличие от принятого ответа, который работает только для iOS.

Добавьте файл prepopulated.realm в папку ресурсов PCL. Отметьте его как встроенный ресурс, щелкнув правой кнопкой мыши и выбрав «Build Action»> «EmbeddedResource».

Создайте приложение.

Из командной строки запуститеmonodic --manifest YourApp.dll на вашем файле DLL, который для отладки находится вYourApp/Droid/bin/Debug, Найти строку сprepopulated.realm и скопируйте строку ресурса.

Отредактируйте файл MainActivity.cs и добавьте следующий код сразу послеbase.OnCreate(savedInstanceState); линия.

Ваш ответ на вопрос