使用Realm的RLMArray存储一串string

有谁知道如何使用Realm来存储string数组? 我正在尝试将以下响应正确映射到Realm中:

"zoneInfo": { "tariffInfoLines": [ "In this city you pay per minute." ] } 

我们有一个zoneInfo对象,它包含一个tariffInfoLines数组。 这个tariffInfoLines数组包含string。 在Realm中,存储数据有两种不同的variablestypes。 首先是RLMObject ,它允许你的标准NSString,int,long等

第二种types是RLMArray ,用于数组(因为不支持NSArray)。 你必须给数组一个types,它必须是一个RLMObject类的子类。 到目前为止我们已经通过使用ABCRealmString对象来解决这个问题,如下所示:

 @property RLMArray<ABCRealmString> *tariffInfoLines; 

ABCRealmString包含一个NSString属性(它基本上是一个包装):

 @property NSString *value; 

然而,这意味着当Realm尝试映射响应以保存数据时,它正在为键“值”(属性的名称)查找值。 看来它预计会有类似于以下的回应:

 "zoneInfo": { "tariffInfoLines": [ { "value": "In this city you pay per minute." }, ] } 

在这个项目中,我们有以下结构:

 "userOptions": [ { "wantsEmailNotifications": true, "wantsPushNotifications": false }, ] 

它有一个数组,里面的对象具有Realm可以映射到的明确的键值对。 zoneInfo结构似乎是唯一的一个我们有一组值的数组,里面没有一个对象或任何键。

如果有人能够说明这一点,关于这是否可以使用Realm,或者是否需要API更改以匹配Realm可以映射的结构。

从github问题响应的交叉发布:虽然这个例子演示了如何在Realm模型中存储平坦的string数组,但是你可以扩展这个模式来存储从整数数组到Swift枚举的任何东西。 基本上任何你可以映射到Realm中的可表示types的东西。

 class RealmString: Object { dynamic var stringValue = "" } class Person: Object { var nicknames: [String] { get { return _backingNickNames.map { $0.stringValue } } set { _backingNickNames.removeAll() _backingNickNames.appendContentsOf(newValue.map({ RealmString(value: [$0]) })) } } let _backingNickNames = List<RealmString>() override static func ignoredProperties() -> [String] { return ["nicknames"] } } // Usage... let realm = try! Realm() try! realm.write { let person = Person() person.nicknames = ["John", "Johnny"] realm.add(person) } for person in realm.objects(Person) { print("Person's nicknames: \(person.nicknames)") } // Prints: // Person's nicknames: ["John", "Johnny"] 

对于Swift 3.0来说,这是一个变化(在我的情况下,当我切换到swift 3.0时,Xcode 8编译器没有提供自动修复function,所以我有一些痛苦来解决它)。

 _backingNickNames.append(objectsIn: newValue.map { RealmString(value: [$0]) }) 

RealmString方法很好,但是每次更新值时最终会得到一个新的RealmString ,如果不清除它们,会留下大量未使用的对象。

我会build议使用像这样的东西:

 fileprivate let separator = "\u{FFFF}" class Person: Object { fileprivate dynamic var _nicknames: String? var nicknames: [String] { get { return _nicknames?.components(separatedBy: separator) ?? [] } set { _nicknames = newValue.isEmpty ? nil : newValue.joined(separator: separator) } } override static func ignoredProperties() -> [String] { return ["nicknames"] } } 
 extension String { func toStringObject() -> StringObject { return StringObject(initValue: self) } } extension Sequence where Iterator.Element == String { func toStringObjects() -> List<StringObject> { let list = List<StringObject>() for s in self { list.append(s.toStringObject()) } return list } } extension Int { func toIntObject() -> IntObject { return IntObject(initValue: self) } } extension Sequence where Iterator.Element == Int { func toIntObjects() -> List<IntObject> { let list = List<IntObject>() for s in self { list.append(s.toIntObject()) } return list } }