2017-09-05 17 views
0

我在運行時收到異常,如下所示。Xamarin Realm no realmobject有鏈接器剝去它們

「不realmobject。已連接剝奪他們......」

我的解決方案包括一個與Visual Studio的Mac PCL,Android和IOS項目,並安裝在每個項目的境界包1.6.0。我也檢查過Fodyweaver.xml包含了正確的引用,並且所有的包都有相同的版本。

當我將PCL包含在與解決方案相同的文件夾中時(即像使用PCL的默認多平臺解決方案),一切正常。

但是我將包含所有領域邏輯的PCL項目移到了一個單獨的文件夾,因此我可以在多個解決方案中使用它。我的解決方案現在包含來自此外部文件夾的PCL,iOS和Android項目也引用了領域包。該應用程序編譯正常,但是當我運行應用程序時,它現在在第一次調用realm.getinstance時收到此異常。

如果將PCL項目重新放入與最初創建的主解決方案相同的文件夾中,它可以正常工作。

任何人都可以提供一個解決這個問題?

回答

0

我現在已經解決了這個問題。首先,我已經應用了@sushhangover的解決方案,但它並沒有直接工作。

經過一番調查後,我發現編譯器根本沒有將類和領域對象編入庫中。

我簡單地加載了獨立於我的主要解決方案的庫,刪除並重新加載了realm包和Fody,清理了所有,重新生成了All。然後我可以看到fodyweaver正常工作。然後,我將該參考添加到我的主要解決方案中,並且一切正常。

1

這是相同的問題把我RealmObject模型到一個單獨的庫(PCL或NetStd)時,我有我使用Viper架構和我分享跨多個解決方案相同的模型。

當調用Realms.Realm.GetInstance(....)時,領域初始化假定RealmObject將位於同一個程序集中,或者包含的程序集已經加載,但它們不屬於這種情況。可以這麼說,是這樣的編譯器警告在大會發出建立(通過Fody處理)被調用GetInstance但沒有任何RealmObjects它:

警告:Fody/RealmWeaver:默認模式似乎爲空。如果您沒有聲明任何RealmObject繼承器,則這不是錯誤。否則,它可能是織布工的錯誤。 (GeneticCancerSelectors)

所以我一個靜態類添加到我的領域模型庫:

public static class RealmModel 
{ 
    public static Realms.Realm GetInstance() => GetInstance(""); 

    public static Realms.Realm GetInstance(string databasePath) => GetInstance(new RealmConfiguration(databasePath)); 

    public static Realms.Realm GetInstance(RealmConfigurationBase config = null) => Realms.Realm.GetInstance(config); 

    public static Task<Realms.Realm> GetInstanceAsync(RealmConfigurationBase config) => Realms.Realm.GetInstanceAsync(config); 
} 

現在,當你需要得到一個領域實例,不叫:

Realms.Realm.GetInstance() 

但請撥打您的型號組件中的一個:

RealmModel.GetInstance() 
+1

澄清爲什麼這會起作用 - 編織器會在PCL/NetStandard庫的模塊初始化器中注入註冊碼,讓Realm知道它的模型。如果在加載庫之前使用了Realm,則問題會自動顯示 - 未運行cctor,因此庫中的模型尚未註冊。通過建議的代碼更改,確保在獲取實例之前訪問該庫,以便它能夠正常工作。或者,您可以在庫中添加一個虛擬的'Init()'方法,並在應用程序啓動時調用它以急切地加載它並調用cctor。 –

+0

@NikolaIrinchev感謝您的額外信息,我應該添加一些關於做假設初始值設定項的內容。我的存儲庫設置總是從我的Realm模型中獲取GetInstance,所以沒有人需要記住「預初始化」它,這也避免了獲取Fody/RealmWeaver編譯器的警告,因爲在其他程序集中沒有編織任何東西。 – SushiHangover

+0

我也在使用VIPER :)。是有道理的 - 但我已經嘗試過了,它不適用於我的解決方案。我有一個名爲DataService的類,我在其上添加了靜態Getinstance()方法。 Dataservice使用ninject庫進行依賴注入初始化 - 所以當dataservice實例被ninject初始化時,構造函數被調用,這就是我稱之爲靜態Getinstance的地方 - 但他仍然會發生異常。我嘗試在Datservice上使用虛擬intialiser,但它仍然失敗 –