2016-10-27 63 views
5

我是Realm中的新成員,我試圖添加一個Array,就像我對字符串所做的一樣,結果出現了一些錯誤。那麼一點點的搜索後,我發現了一個解決方案:使用swift將數組添加到Realm

class Sensors : Object { 


    dynamic var name = "" 
    dynamic var message = "" 

    var topic: [String] { 
     get { 
      return _backingNickNames.map { $0.stringValue } 
     } 
     set { 
      _backingNickNames.removeAll() 
      _backingNickNames.append(objectsIn: newValue.map({ RealmString(value: [$0]) })) 
     } 
    } 
    let _backingNickNames = List<RealmString>() 

    override static func ignoredProperties() -> [String] { 
     return ["topic"] 
    } 




} 

class RealmString: Object { 
    dynamic var stringValue = "" 
} 

這是工作非常好,現在我想添加這個類裏面另一個數組。 如果有人知道任何其他方式添加領域的陣列,請分享它。

在此先感謝

+0

什麼是使用列表的問題? – Horst

+0

沒有我說我是新的,我不是我的全部選擇 –

回答

9

一般來說它的方式更有效地使用了一個一對多的境界提供的,而不是試圖通過使用陣列(Realm的集合是懶惰的模仿他們的關係,對象包含有僅在需要時才實例化,而不是簡單的Swift數組)。

就你而言,如果我正確理解你想要做的事情,你想添加[RealmString] Swift數組到_backingNickNames列表。

爲什麼不使用領域的List類的append(objectsIn:)方法(見here),像這樣:

// Dog model 
class Dog: Object { 
    dynamic var name = "" 
    dynamic var owner: Person? 
} 

// Person model 
class Person: Object { 
    dynamic var name = "" 
    dynamic var birthdate = NSDate(timeIntervalSince1970: 1) 

    let dogs = List<Dog>() 
} 

let jim = Person() 

let dog1 = Dog() 
let dog2 = Dog() 

// here is where the magic happens 
jim.dogs.append(objectsIn: [dog1, dog2]) 

如果你想要做的相反(從列表到一個數組轉換)只是做:

let dogsArray = Array(jim.dogs) 

••••••••

回到你的own posted solution,你可以很容易地重構模型來適應這一點。每個Sensor對象可能有幾個Topic和幾個Message對象。

僅有溝messagetopic計算特性和分別重命名topicVmessageVtopicsmessages。還將RealmString重命名爲TopicRealmString1Message。現在

,你可以很容易地通過迭代,比如,主題連接到傳感器這樣的:

for topic in sensor1.topics { ... } 

或者,如果你想將消息附加到你可以做這樣的事情傳感器(唐」別忘了properly add新創建的對象的數據庫在前):

let message1 = Message() 
message1.stringValue = "Some text" 

sensor2.messages.append(message1) 

因此,沒有必要使用中介斯威夫特陣列。

+0

感謝您的答案,我會檢查,看看這是我想要的 –

+0

@mikevorisis:只是好奇,如果這是以任何方式幫助你。 –

+0

其實經過一番搜索和測試後,我終於明白了這是如何工作的,我發現你的方式比我的更容易,所以我會將你的問題標記爲最佳答案!再次感謝你! –

0

bogdanf說了什麼,你實施它的方式都是正確的。

除基本值類型外,Realm只能存儲對單數Realm Object對象的引用,以及使用List類型的Object的數組。因此,如果您想要保存一組數據類型,則必須將您想要保存的任何基本類型(如String)封裝在便利的Realm Object中。

就像bogdanf說的那樣,不建議將Realm List s轉換成標準的Swift數組,然後再回來,因爲你失去了Realm延遲加載功能的優點(這可能會導致性能和內存問題),但是內存問題可以至少可以通過在@autoreleasepool塊中將代碼複製數據封裝在Realm中來緩解。

class MyObject: Object { 
    dynamic var childObject: MyObject? 
    let objectList = List<MyObject>() 
} 

因此,在回顧,這是直接與領域合作List對象只要有可能,並通過每一個孩子對象的領域使用@autoreleasepool你其實任何時候要循環的最佳實踐。 :)

2

測試後,我設法增加另一個陣列那樣:

class Sensors : Object { 


    dynamic var type = "" 
    dynamic var name = "" 
    dynamic var badge = 0 

    var topic: [String] { 
     get { 
      return topicV.map { $0.stringValue } 
     } 
     set { 
      topicV.removeAll() 
      topicV.append(objectsIn: newValue.map({ RealmString(value: [$0]) })) 
     } 
    } 

    var message: [String] { 
     get { 
      return messageV.map { $0.stringValue1 } 
     } 
     set { 
      messageV.removeAll() 
      messageV.append(objectsIn: newValue.map({ RealmString1(value: [$0]) })) 
     } 
    } 





    let topicV = List<RealmString>() 
    let messageV = List<RealmString1>() 

    override static func ignoredProperties() -> [String] { 
     return ["topic", "message"] 
    } 




} 

class RealmString: Object { 
    dynamic var stringValue = "" 
} 

class RealmString1: Object { 
    dynamic var stringValue1 = "" 
} 
+0

Mike,爲什麼你在Realm Lists和Swift Arrays之間來回轉換並不是很清楚?這非常低效,並增加了代碼的不必要的複雜性。 –

+0

我無法理解我該如何使用其他方式 –

+0

我已經更新了我的答案,以展示一種可能的方式來正確地重構代碼,以利用在模型中使用完整的Realm對象和關係。 –