2016-10-27 39 views
5

Realm'teyim ve dizelerle yaptığım gibi bir Array eklemeyi denedim ve bazı hatalarla karşılaştım. Bu çok iyi çalışıyorHızlı 3 ile Realm için diziler ekleyin

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 = "" 
} 

, şimdi bu sınıfın içinde başka dizi eklemek istiyorum: Yani biraz aramadan sonra ben bir çözüm buldum. Birisi bölge ile diziler eklemenin başka yollarını biliyorsanız, lütfen paylaşın. Genel bir kural olarak peşin

+0

Listesi'ni kullanarak problemi nedir? – Horst

+0

Yeni olduğumu söylemediğim gibi değil ve tüm seçimlerimi yapmadım –

cevap

9

yılında

sayesinde bu nesneleri içerdiği bire birçok yerine (Diyar adlı koleksiyonları tembel dizileri kullanarak onları taklit etmeye çalışırken Diyarı tarafından sağlanan ilişkiler vardır kullanmak daha etkilisi var sadece düz Swift dizilerinin aksine gerektiğinde başlatılır).

Sizin durumunuzda, ne yapmaya çalıştığınızı doğru anlıyorsam, [RealmString] Swift dizilerini _backingNickNames listesine eklemek istiyorsunuz.

Diyar adlı List sınıfının append(objectsIn:) yöntemini kullanmayın Neden böyle, (here bakınız):

// 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]) 

Eğer (dizi için bir listesi dönüştürmek) sadece bunu tersi yapmak istiyorsanız:

let dogsArray = Array(jim.dogs) 

• • • • • • • •

sizin own posted solution dön

, kolayca planı ayrı olabilir bunu karşılamak için model. Her Sensor nesnesinin birden fazla Topic ve eklenmiş Message nesnesi olabilir.

Sadece message ve topic bilgisayarlı özelliklerini hendek ve sırasıyla topics ve messages için topicV ve messageV adlandırın. Ayrıca RealmString'u Topic ve RealmString1 için Message olarak yeniden adlandırın.

for topic in sensor1.topics { ... } 

Yoksa (Böyle bir şey yapabileceğini bir sensör bir mesaj eklemek don istiyorsanız':

Şimdi, kolayca boyunca yineleme, ne diyelim, konu böyle bir sensör takılı t) ilk properly add DB yeni oluşturulan nesneyi unutmak:

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

sensor2.messages.append(message1) 

Yani, gerek aracı Swift Dizileri kullanmak.

+0

Cevabınız için teşekkürler. İstediğimin olup olmadığını kontrol edip göreceğim –

+0

@mikevorisis: Sadece bu size herhangi bir şekilde yardımcı oluyorsa merak ediyorum. –

+0

Aslında küçük bir arama ve testten sonra, bunun nasıl çalıştığını nihayet anladım ve yolumu kendiminkinden daha kolay buluyorum, böylece sorunuzu en iyi cevap olarak işaretleyeceğim! Tekrar teşekkürler! –

0

Ne bogdanf demişti ve nasıl uygulandığınız her ikisi de doğru.

Temel değer türleri bir yana, Realm yalnızcatürünü kullanarak tekil Realm Object nesnelerinin yanı sıra Object dizileri için başvuruları depolayabilir. Bu nedenle, bir dizi tür kaydetmek istiyorsanız, kaydetmek istediğiniz herhangi bir temel türü (burada String gibi) bir uygunluk Realm Object içine kapsüllemek gerekir.

bogdanf'ın dediği gibi, Realm'nin List s standart Swift dizilerine dönüştürülmesi tavsiye edilmez, çünkü Realm'nin tembel yükleme özelliklerinin (hem performans hem de bellek sorunlarına neden olabilir) avantajlarını kaybedersiniz, ancak bellek sorunları En azından, @autoreleasepool bloğundaki Realm'den kod kopyalama verilerini içerecek şekilde azaltılmalıdır.

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

Yani incelemede, bu mümkünse Diyar doğrudan List nesneleri çalışmak ve bir Realm her çocuk nesnesi aracılığıyla döngü aslında yapmak her zaman istediğiniz @autoreleasepool kullanmak en iyi uygulamadır. :) Ben böyle başka dizi eklemek için yönetilen testten sonra

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 Listeleri ve Swift Arrays arasında neden dönüş yaptığınızı pek net değil? Çok verimsiz ve kodunuza gereksiz karmaşıklık katıyor. –

+0

Diğer yöntemlerimi nasıl kullanabileceğimi anlayamadım –

+0

Modelinizdeki tüm Realm nesnelerini ve ilişkilerini kullanabilmeniz için kodunuzu doğru bir şekilde yeniden kodlamak için olası bir yolu göstermek üzere cevabımı güncelledim. –