我正在尝试使用现有的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中解决它。我在这里做错了什么?
答案 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
时更容易使用。