【问题标题】:Array of strings is not saved to Realm object using ObjectMapper字符串数组未使用 ObjectMapper 保存到领域对象
【发布时间】:2018-03-30 11:28:58
【问题描述】:

这就是我在 My Object 中声明 imageurls 的方式:

var imageURLs = List<String>()

和解析:

func mapping(map: Map) {
    imageURLs <- map["image_urls"]
}

这就是我要解析的内容:

{ "image_urls": ["a"] }

最后上面的属性是空的。为什么?

使用 Realm 3.3,所以原语数组应该可以工作。

【问题讨论】:

  • 试过 var imageURLs = [String]()
  • *** Terminating app due to uncaught exception 'RLMException', reason: 'Property 'imageURLs' is declared as 'NSArray', which is not a supported RLMObject property type. All properties must be primitives, NSString, NSDate, NSData, NSNumber, RLMArray, RLMLinkingObjects, or subclasses of RLMObject.
  • 你应该试试这个let imageURLs = List&lt;String&gt;()看看这个realm.io/docs/swift/latest/#property-attributes
  • 然后将其声明为 RLMArray
  • Left side of mutating operator isn't mutable: 'imageURLs' is a 'let' constant

标签: ios swift realm objectmapper


【解决方案1】:

如果您同时使用 Realm 和 ObjectMapper,有一个非常酷的选项,通过使用 ObjectMapper+Realm,您可以将数组直接映射到领域列表,如下所示:

func mapping(map: Map) {
    imageURLs <- (map["image_urls"], ListTransform<String>())
}

请注意,默认情况下,对象映射器无法将数组映射为领域列表,这可以通过使用上述库来实现。

【讨论】:

  • 你不能这样做,因为 ListTransform 需要一个 RealmSwift 对象,而不是原始类型。错误:“ListTransform”要求“String”继承自“Object”。
【解决方案2】:

您可以在函数中创建一个变量并将项目映射到一个数组:

func mapping(map: Map) {
   var pathes = [String]()
   pathes <- map["image_urls"]
   self.imageUrls.add(pathes)
}

或者您可以使用扩展名为ObjectMapper+Realm,如上所述。

【讨论】:

    【解决方案3】:

    您可以使用 ObjectMapper 映射字符串数组,如下所示,效果很好:

    import ObjectMapper
    import RealmSwift
    import ObjectMapper_Realm
    
    public class Items: Object, Mappable {
    
    var images = List<ListImages>()
    @objc dynamic var id = 0
    
    required convenience public init?(map : Map){
       self.init()
    }
    
    public override class func primaryKey() -> String? {
       return "id"
    }
    
    public func mapping(map: Map) {
    var images: [String]? = nil
    images <- map["image"]
    
    images?.forEach { image in
        let value = ListImages()
        value.value = image
        self.images.append(value)
      }
    }
    }
    
    
    class ListImages:Object{
        @objc dynamic var value: String = ""
    }
    

    【讨论】:

      【解决方案4】:

      我已经使用RealmTypeCastTransform()解决了这个问题

      在你的代码中添加这个

      func mapping(map: Map) {
          imageURLs <- (map["image_urls"], RealmTypeCastTransform())
      }
      

      现在 import ObjectMapperAdditions 在文件的开头

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        相关资源
        最近更新 更多