【发布时间】:2015-06-24 03:53:03
【问题描述】:
我对使用 Core Data 很陌生,但我无法保存我的上下文。下面是一种从我的数据库中获取团队时间表的方法,然后将游戏存储在 Schedule Core Data 实体中。但问题是当我调用 context.save(nil) 时游戏对象不会保存。请注意,我从另一个名为 login() 的方法调用 getTeamSchedule(),您可以在下面找到该方法。
func getTeamSchedule()
{
let appDel:AppDelegate = UIApplication.sharedApplication().delegate as!AppDelegate
let context:NSManagedObjectContext = appDel.managedObjectContext!
// check if a teams schedule exists in database
if(doesTeamScheduleExist() == true)
{
return
}
else
{
// download schedule
let dao = DatabaseRequests()
let request = dao.buildURLRequest("appGetSchedule.php", postStringWithValue: "teamId=\(self.id)")
let task = NSURLSession.sharedSession().dataTaskWithRequest(request)
{ data, response, error in
if(error == nil)
{
var err:NSError?
var scheduleData = (NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &err)) as! NSArray
let entSchdl = NSEntityDescription.entityForName("Schedule", inManagedObjectContext: context)
let entTeam = NSEntityDescription.entityForName("Team", inManagedObjectContext: context)
// loop through data set
for(var index = 0; index < scheduleData.count; index++)
{
/* I Grab My Data From JSON Here*/
var homeTeam : Team
var awayTeam : Team
// check for home team in DB
if(self.doesTeamExistByString(homeId) == true)
{
// get team
homeTeam = self.getStoredTeamByString(homeId)
}
else
{
// create team
homeTeam = self.createNewTeam(homeId, tName: homeName)
}
//check for away team in DB
if(self.doesTeamExistByString(awayId) == true)
{
// get team
awayTeam = self.getStoredTeamByString(awayId)
}
else
{
awayTeam = self.createNewTeam(awayId, tName: awayName)
}
// create a set to store the home and away team objects
// create a set to store the home and away team object
let teamSet:NSSet = ([awayTeam, homeTeam])
// fetch level object
let lvl = self.getStoredLevelByString(level)
var newGame = Schedule(entity: entSchdl!, insertIntoManagedObjectContext: context)
newGame.id = gameId
newGame.homeTeamID = homeId
newGame.awayTeamID = awayId
newGame.levelID = level
newGame.date = dateAsNSDate!
newGame.toTeam = teamSet
newGame.toLevel = lvl
println(newGame)
此时,我打印 newGame 对象,显示所有必需的属性和关系都已填充,因此我运行 context.save() 但未保存 newGame 对象
var saveError:NSError?
//save context
context.save(&saveError)
println(saveError)
}
}
else
{
println("error =\(error)")
}
}
task.resume()
}
}
这是新的游戏对象
<Schedule: 0x7f8f8ae89110> (entity: Schedule; id: 0x7f8f8ae89180 <x-coredata:///Schedule/t3FF77C1C-6BFD-41F9-9F7E-04D851B11EAB3> ; data: {
awayTeamID = 13;
date = "2015-06-15 05:00:00 +0000";
homeTeamID = 13;
id = 2;
levelID = 1;
toGameLog = (
);
toLevel = "0xd000000000340004 <x-coredata://1B97E1D1-833F-4978-B1A8-05C4BE90A80A/Level/p13>";
toTeam = (
"0xd000000000840006 <x-coredata://1B97E1D1-833F-4978-B1A8-05C4BE90A80A/Team/p33>"
);
})
这是我遇到的错误
Optional(Error Domain=NSCocoaErrorDomain Code=1580 "The operation couldn’t be completed. (Cocoa error 1580.)" UserInfo=0x7f8f8ae8cfc0 {NSValidationErrorObject=<Schedule: 0x7f8f8ae89110> (entity: Schedule; id: 0x7f8f8ae89180 <x-coredata:///Schedule/t3FF77C1C-6BFD-41F9-9F7E-04D851B11EAB3> ; data: {
awayTeamID = 13;
date = "2015-06-15 05:00:00 +0000";
homeTeamID = 13;
id = 2;
levelID = 1;
toGameLog = (
);
toLevel = "0xd000000000340004 <x-coredata://1B97E1D1-833F-4978-B1A8-05C4BE90A80A/Level/p13>";
toTeam = (
"0xd000000000840006 <x-coredata://1B97E1D1-833F-4978-B1A8-05C4BE90A80A/Team/p33>"
);
}), NSValidationErrorValue=Relationship 'toTeam' on managed object (0x7f8f8ae89110) <Schedule: 0x7f8f8ae89110> (entity: Schedule; id: 0x7f8f8ae89180 <x-coredata:///Schedule/t3FF77C1C-6BFD-41F9-9F7E-04D851B11EAB3> ; data: {
awayTeamID = 13;
date = "2015-06-15 05:00:00 +0000";
homeTeamID = 13;
id = 2;
levelID = 1;
toGameLog = (
);
toLevel = "0xd000000000340004 <x-coredata://1B97E1D1-833F-4978-B1A8-05C4BE90A80A/Level/p13>";
toTeam = (
"0xd000000000840006 <x-coredata://1B97E1D1-833F-4978-B1A8-05C4BE90A80A/Team/p33>"
);
}) with objects {(
<Team: 0x7f8f8ae87120> (entity: Team; id: 0xd000000000840006 <x-coredata://1B97E1D1-833F-4978-B1A8-05C4BE90A80A/Team/p33> ; data: {
id = 13;
name = "Ghost Team";
toDefenseLineup = "<relationship fault: 0x7f8f8ae80480 'toDefenseLineup'>";
toPlayer = "<relationship fault: 0x7f8f8ae804c0 'toPlayer'>";
toSchedule = (
"0x7f8f8ae89180 <x-coredata:///Schedule/t3FF77C1C-6BFD-41F9-9F7E-04D851B11EAB3>"
);
})
)}, NSValidationErrorKey=toTeam, NSLocalizedDescription=The operation couldn’t be completed. (Cocoa error 1580.)})
我已尝试查找错误代码 1580 但找不到任何内容,如果有人有任何资源或知道问题所在,我将不胜感激。
出于好奇,这是什么意思
relationship fault: 0x7f8f8ae804c0 'toPlayer';
【问题讨论】:
-
很高兴知道
context.save()正在生成什么错误。您能否创建一个错误变量var saveError: NSError?并尝试使用该错误context.save(&saveError)进行保存。然后在保存后,打印错误println(saveError)并报告告诉你的内容? -
错误域=NSCocoaErrorDomain 代码=1580
-
我添加了错误以及 newGame 对象的打印
-
我开始讨论这个问题可能是您的数据模型的设置方式。具体来说,您配置实体之间的关系的方式。查看this question。虽然我认为这不会是对您问题的快速转换答案,但它可能会让您走上正确的轨道。