【问题标题】:Swift Coredata Wont Save Due To Error Code 1580由于错误代码 1580,Swift Coredata 无法保存
【发布时间】: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(&amp;saveError) 进行保存。然后在保存后,打印错误println(saveError) 并报告告诉你的内容?
  • 错误域=NSCocoaErrorDomain 代码=1580
  • 我添加了错误以及 newGame 对象的打印
  • 我开始讨论这个问题可能是您的数据模型的设置方式。具体来说,您配置实体之间的关系的方式。查看this question。虽然我认为这不会是对您问题的快速转换答案,但它可能会让您走上正确的轨道。

标签: ios swift core-data


【解决方案1】:

我认为问题不是你的newGame 对象,而是你的homeTeamawayTeam 对象。具体来说,这两行:

    var homeTeam = Team(entity: entTeam!, insertIntoManagedObjectContext: context)
    var awayTeam = Team(entity: entTeam!, insertIntoManagedObjectContext: context)

创建两个新对象。在您的if 语句中,您将这些变量重新分配给新创建或新获取的对象。在任何一种情况下,以上行创建的对象都没有设置任何属性。当您保存上下文时,这些对象将无法通过验证并触发错误。

将上面两行改为:

    var homeTeam : Team
    var awayTeam : Team

这将声明两个变量而不创建新的 Team 对象。

【讨论】:

  • 我试过你修复但仍然出现错误。我在问题中发布了错误。错误代码是 1580。
  • 1580 错误代码表示“关系缺少最小计数错误”。如果您看,toTeam 只显示一个对象 - 您是否在数据模型中指定了最小数量?显然teamSet 包括两个项目——但它们可以相同吗?如果它们是重复的,NSSet 只会存储一个。换句话说,是homeId = awayId?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多