iOS:当属性为双精度时,Core Data 无法保存
iOS: Core Data fails to save when attribute is a double
我想在我把笔记本电脑飞出 window 之前先在这里问一下。我是 iOS 开发的新手,一直在尝试使用 Core Data 来创建费用管理器应用程序。我有一个名为 "Account" 的实体,它有两个非可选属性(name 和 initBalance),如下所示:
我还创建了一个 NSManagedObject 子类,如下所示:
//Account.swift
class Account: NSManagedObject {
override func awakeFromInsert() {
super.awakeFromInsert()
initBalance = NSNumber(double: 0.0)
name = ""
}
}
//Account+CoreDataProperties.swift
extension Account {
@NSManaged var initBalance: NSNumber
@NSManaged var name: String
}
Account 实体使用 NSFetchedResultsController 在 AccountsViewController(符合 NSFetchedResultsControllerDelegate 协议的 UITableViewController 的子类)中显示。要添加一个新帐户,我使用 AccountsViewController 的 segue 将我定向到 AccountInfoViewController(如下所示),它有两个文本字段,一个用于名称,一个用于帐户余额。当后者即将消失时,将在上下文中插入一个新帐户,其名称和余额来自 textFields。一旦父控制器出现 (AccountsViewController),它会尝试保存更改并更新 tableView。
现在,如果我插入一个余额为整数的新帐户,我的生活就很好;上下文能够保存更改,tableView 通过显示新插入的帐户更新其行,我很高兴。当我尝试插入一个余额为十进制数的帐户时,应用程序会在上下文尝试保存更改时崩溃。关于它发生的原因,我根本没有得到任何有用的错误。这是管理文本字段的控制器的代码:
class AccountInfoViewController: UIViewController {
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var balanceField: UITextField!
var store: DataStore! // set by the parent viewController everytime this controller appears
let numberFormatter = MyFormatter()
// insert the new account into the context before the controller disappears
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
store.insertAccount(nameField.text!, balance: numberFormatter.numberFromString(balanceField.text!)!)
}
}
MyFormatter 是这样的:
func MyFormatter() -> NSNumberFormatter {
let formatter = NSNumberFormatter()
formatter.numberStyle = .DecimalStyle
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
return formatter
}
上面显示的 DataStore 包含一个简单的核心数据堆栈,并负责插入到上下文中:
// DataStore.swift
class DataStore {
let coreDataStack = CoreDataStack(modelName: "SmartMoney")
// inserts a new account into the context
func insertAccount(name: String, balance: NSNumber) -> Account {
let account = NSEntityDescription.insertNewObjectForEntityForName("Account",
inManagedObjectContext: coreDataStack.mainQueueContext) as! Account
account.name = name
account.initBalance = balance
return account
}
}
当 balanceField 包含非整数时,上下文无法保存更改的原因是什么?感谢您的阅读,如果您希望我 post 代码的任何其他部分,请告诉我。
我终于明白是怎么回事了。将我的属性名称从 initBalance
更改为 startingBalance
会使一切重新正常工作。事实上,将属性名称更改为任何不以 new
或 init
开头的名称都可以正常工作。我从这个 post.
得到了灵感
似乎在使用 ARC 时,您的 属性 的名字不应该以单词 new
开头。事实证明,initBalance
(或 newBalance
就此而言)会产生相同的问题。希望它能帮助下一个遇到类似问题的可怜人 运行。
我想在我把笔记本电脑飞出 window 之前先在这里问一下。我是 iOS 开发的新手,一直在尝试使用 Core Data 来创建费用管理器应用程序。我有一个名为 "Account" 的实体,它有两个非可选属性(name 和 initBalance),如下所示:
我还创建了一个 NSManagedObject 子类,如下所示:
//Account.swift
class Account: NSManagedObject {
override func awakeFromInsert() {
super.awakeFromInsert()
initBalance = NSNumber(double: 0.0)
name = ""
}
}
//Account+CoreDataProperties.swift
extension Account {
@NSManaged var initBalance: NSNumber
@NSManaged var name: String
}
Account 实体使用 NSFetchedResultsController 在 AccountsViewController(符合 NSFetchedResultsControllerDelegate 协议的 UITableViewController 的子类)中显示。要添加一个新帐户,我使用 AccountsViewController 的 segue 将我定向到 AccountInfoViewController(如下所示),它有两个文本字段,一个用于名称,一个用于帐户余额。当后者即将消失时,将在上下文中插入一个新帐户,其名称和余额来自 textFields。一旦父控制器出现 (AccountsViewController),它会尝试保存更改并更新 tableView。
现在,如果我插入一个余额为整数的新帐户,我的生活就很好;上下文能够保存更改,tableView 通过显示新插入的帐户更新其行,我很高兴。当我尝试插入一个余额为十进制数的帐户时,应用程序会在上下文尝试保存更改时崩溃。关于它发生的原因,我根本没有得到任何有用的错误。这是管理文本字段的控制器的代码:
class AccountInfoViewController: UIViewController {
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var balanceField: UITextField!
var store: DataStore! // set by the parent viewController everytime this controller appears
let numberFormatter = MyFormatter()
// insert the new account into the context before the controller disappears
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
store.insertAccount(nameField.text!, balance: numberFormatter.numberFromString(balanceField.text!)!)
}
}
MyFormatter 是这样的:
func MyFormatter() -> NSNumberFormatter {
let formatter = NSNumberFormatter()
formatter.numberStyle = .DecimalStyle
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
return formatter
}
上面显示的 DataStore 包含一个简单的核心数据堆栈,并负责插入到上下文中:
// DataStore.swift
class DataStore {
let coreDataStack = CoreDataStack(modelName: "SmartMoney")
// inserts a new account into the context
func insertAccount(name: String, balance: NSNumber) -> Account {
let account = NSEntityDescription.insertNewObjectForEntityForName("Account",
inManagedObjectContext: coreDataStack.mainQueueContext) as! Account
account.name = name
account.initBalance = balance
return account
}
}
当 balanceField 包含非整数时,上下文无法保存更改的原因是什么?感谢您的阅读,如果您希望我 post 代码的任何其他部分,请告诉我。
我终于明白是怎么回事了。将我的属性名称从 initBalance
更改为 startingBalance
会使一切重新正常工作。事实上,将属性名称更改为任何不以 new
或 init
开头的名称都可以正常工作。我从这个 post.
似乎在使用 ARC 时,您的 属性 的名字不应该以单词 new
开头。事实证明,initBalance
(或 newBalance
就此而言)会产生相同的问题。希望它能帮助下一个遇到类似问题的可怜人 运行。