Swift:由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:'实体名称不能为零。'

时间:2016-04-21 17:22:51

标签: ios iphone swift uitableview core-data

我正在尝试使用现有的swift项目实现CoreData。我跟着this tutorial并使用UITableView实现了它。

当我获取数据模型记录时(在另一个视图控制器中),数据会有争议地添加到数据模型(来自另一个视图控制器)。

问题

使用UITableView导航到View Controller,一次显示数据模型中的数据。点击tableView或向上或向下滑动导致应用程序崩溃并显示错误

  

由于未捕获的异常终止应用' NSInvalidArgumentException',原因:'实体名称不得为零。'

保存记录的功能:

func saveData(date: String, usr : String, piid: String, healthD:String, temp:String, humd:String) {
        //1
        let managedContext = DataController().managedObjectContext

        //2
        let entity =  NSEntityDescription.entityForName("Hygeine",
            inManagedObjectContext:managedContext)

        let health = NSManagedObject(entity: entity!,
            insertIntoManagedObjectContext: managedContext)

        //3
        health.setValue(date, forKey: "date")
        health.setValue(healthD, forKey: "health")
        health.setValue(temp, forKey: "temp")
        health.setValue(humd, forKey: "humd")
        health.setValue(piid, forKey: "pi_id")
        health.setValue(usr, forKey: "usr")
        //4
        do {
            try managedContext.save()
            //5
            healthData.append(health)
        } catch let error as NSError  {
            print("Could not save \(error), \(error.userInfo)")
        }
    }

使用UITableView的ViewController的ViewWillAppear:

override func viewWillAppear(animated: Bool) {

        let managedContext = DataController().managedObjectContext

        //2
        let fetchRequest = NSFetchRequest(entityName: "Hygeine")

        //3
        do {
            let results =
            try managedContext.executeFetchRequest(fetchRequest)
            healthData = results as! [NSManagedObject]
        } catch let error as NSError {
            print("Could not fetch \(error), \(error.userInfo)")
        }
    }

这个问题有很多Objective-C解决方案但是如何在Swift中解决它。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

function New-Ace { [CmdletBinding()] Param( [Parameter(Mandatory=$true, Position=0)] [Security.Principal.NTAccount]$Account, [Parameter(Mandatory=$false, Position=1)] [Security.AccessControl.FileSystemRights]$Permissions = 'ReadAndExecute', [Parameter(Mandatory=$false, Position=2)] [Security.AccessControl.InheritanceFlags]$InheritanceFlags = 'ContainerInherit,ObjectInherit', [Parameter(Mandatory=$false, Position=3)] [Security.AccessControl.PropagationFlags]$PropagationFlags = 'None', [Parameter(Mandatory=$false, Position=4)] [Security.AccessControl.AccessControlType]$Type = 'Allow' ) New-Object Security.AccessControl.FileSystemAccessRule( $Account, $Permissions, $InheritanceFlags, $PropagationFlags, $Type ) } $domain = 'ESG.INTL' $administrators = ([wmi]"Win32_Sid.Sid='S-1-5-32-544'").AccountName $ADDomainUsers = "$domain\Domain Users" $acl = Get-Acl $path $administrators, "$domain\Domain Admins" | ForEach-Object { $acl.AddAccessRule((New-Ace $_ 'FullControl')) } $acl.AddAccessRule((New-Ace $ADNameRW 'Modify')) $acl.AddAccessRule((New-Ace $ADNameRO 'ReadAndExecute')) $acl.AddAccessRule((New-Ace $ADDomainUsers 'ReadAndExecute')) 返回一个强制解包的可选项。这很可能是您的错误,很容易被调试器捕获。

您的实体名称输入错误了吗?请根据您的型号进行检查。

正如其他人所说,学习entityForName,虽然它不会解决此错误,但在处理NSFetchedResultsController时更容易使用。