Realm将数据追加到List <t>types
我试图通过数据,并将其保存在我的模型,但无论我做我不断收到以下错误: Can't mutate a persisted array outside of a write transaction.
。 我究竟做错了什么? 我将每场比赛附加到联赛,但它似乎并没有工作?
领域模型
class League: Object { dynamic var id: Int = 0 dynamic var name: String? = "" var matches = List<Match>() override class func primaryKey() -> String { return "id" } } class Match: Object { dynamic var matchId: Int = 0 dynamic var date: NSDate? dynamic var homeName: String? = "" dynamic var awayName: String? = "" dynamic var awayScore: Int = 0 dynamic var homeScore: Int = 0 dynamic var leagueName: String? = "" dynamic var homeLogo: NSData? dynamic var awayLogo: NSData? }
码
for (_, item) in result { if let leagueId = item["league"].int, let leagueName = item["name"].string, let allMatches = item["matches"].array { let league = League() league.name = leagueName league.id = leagueId for match in allMatches { if let matchId = match["matchId"].int, let tournament = match["tournament"].string, let homeTeam = match["homeName"].string, let awayTeam = match["awayName"].string, let homeScore = match["homeScore"].int, let awayScore = match["awayScore"].int, let homeLogo = match["homeLogo"].string, let awayLogo = match["awayLogo"].string, let date = match["date"].string { if let awayLogoUrl = NSURL(string: awayLogo), let homeLogoUrl = NSURL(string: homeLogo) { if let awayLogoData = NSData(contentsOfURL: awayLogoUrl), let homeLogoData = NSData(contentsOfURL: homeLogoUrl) { let matchObject = Match() matchObject.matchId = matchId matchObject.leagueName = tournament matchObject.homeName = homeTeam matchObject.awayName = awayTeam matchObject.homeScore = homeScore matchObject.awayScore = awayScore matchObject.homeLogo = homeLogoData matchObject.awayLogo = awayLogoData let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" formatter.timeZone = NSTimeZone(abbreviation: "CET") matchObject.date = formatter.dateFromString(date)! league.matches.append(matchObject) } } } print(league) try! realm.write { realm.add(league, update: true) } } } } }
简化代码只显示一般结构有助于揭示问题:
let league = League() league.name = leagueName league.id = leagueId for match in allMatches { if … { let matchObject = Match() … league.matches.append(matchObject) } print(league) try! realm.write { realm.add(league, update: true) } }
这是一连串的事件:你开始创build一个独立的,没有League
实例, league
。 对于每场比赛,您创build一个独立的,未被执行的Match
实例,并将其附加到league.matches
。 然后,您创build一个写交易,并将league
保存到领域。 从这一点来看, league
不再是独立的,只能在写交易中进行修改。 在循环的下一个迭代中,创build另一个Match
实例,并尝试将其附加到league.matches
。 这是因为league
是持续的,我们不是在写交易。
这里的一个解决scheme是重构代码,所以你只能把league
保存到领域,就像这样:
let league = League() league.name = leagueName league.id = leagueId for match in allMatches { if … { let matchObject = Match() … league.matches.append(matchObject) } } print(league) try! realm.write { realm.add(league, update: true) }
上面的post是错误的,你不能在一个写块之外改变一个领域模型的列表。
正确的方法是:
try! realm.write { league.matches.append(matchObject) realm.add(league, update: true) }
至less这是Realm版本0.98的常用方法