如何使用 core-data 存储一个值? (迅速 2)
Posted
技术标签:
【中文标题】如何使用 core-data 存储一个值? (迅速 2)【英文标题】:How to store one value using core-data ? (swift 2) 【发布时间】:2016-01-26 00:17:01 【问题描述】:我正在开发一个应用程序来使用核心数据一次存储一个电话号码,用户应该能够在 ui 文本字段中输入一个新的电话号码,如果它等于 nil,它应该存储一个新的电话号码,否则它应该用新号码替换旧号码;它应该只存储一个值。
但代码无法正常工作
我的代码有什么问题?
let moContext: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let context: NSManagedObjectContext = moContext.managedObjectContext
let phoneNu = NSEntityDescription.insertNewObjectForEntityForName("Setting", inManagedObjectContext: context)
let fetchRequest = NSFetchRequest(entityName: "Setting")
fetchRequest.predicate = NSPredicate(format: "phoneNumber = %@", phoneNumber)
// phoneNu.setValue(phoneNumber.text, forKey: "phoneNumber")
do
let request = NSFetchRequest(entityName: "Setting")
let phoneN = try context.executeFetchRequest(request)
if phoneN.count == 0
phoneNu.setValue(phoneNumber.text, forKey: "phoneNumber")
else if phoneN.count != 0
for item in phoneN as! [NSManagedObject]
let number = item.valueForKey("phoneNumber")
number?[0]?.setValue(phoneNumber.text, forKey: "phoneNumber")
catch
print("error")
do
let request = NSFetchRequest(entityName: "Setting")
let phoneNumber = try context.executeFetchRequest(request)
if phoneNumber.count > 0
for item in phoneNumber as! [NSManagedObject]
let number = item.valueForKey("phoneNumber")
print(number!)
catch
【问题讨论】:
【参考方案1】:这是我的解决方案
let moContext: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let context: NSManagedObjectContext = moContext.managedObjectContext
guard let phoneNumber = phoneNumber.text where phoneNumber.characters.count > 0 else
return// returns if textField is empty.
let fetchRequest = NSFetchRequest(entityName: "Setting")
fetchRequest.predicate = NSPredicate(format: "phoneNumber = %@", phoneNumber)
do
let request = NSFetchRequest(entityName: "Setting")
let phoneObjectArray = try context.executeFetchRequest(request)
guard let settingFetched = phoneObjectArray as? [Setting] where settingFetched.count > 0 else
// if enters here -> 0 phone numbers were found
if let setting = NSEntityDescription.insertNewObjectForEntityForName("Setting", inManagedObjectContext: context) as? Setting
setting.phoneNumber = phoneNumber
// call context.save()
return // this I forgot
let settingObject = settingFetched.first
// fetch results return store phone number.
// update phone number
settingObject.phoneNumber = phoneNumber
// call context.save()
catch let error as NSError!
print("error: \(error)")
你需要调用“save()”函数来持久化信息。
我对名称变量进行了一些更改,添加了一些验证,并根据您的代码假设了一些模型类名称。 我始终建议使用您的 NSManagedObject 子类(我假设的设置),而不仅仅是使用 NSManagedObject 和键/值编码。
由于我使用的是文本编辑器,代码中可能存在一些小的语法错误。
希望这会有所帮助!
【讨论】:
出现了 2 个错误,第 5 行的第一个错误说“非 void 函数应该返回一个值”,第 15 行的第二个错误说“使用未解析的标识符 'setting'” 我认为你没有正确实现代码......让我试着帮助你。在“守卫”内的回报中,你什么也不回报。如果该函数是一个 Void 函数 (function() ),这只会让您脱离该方法。至于第二个错误,你是用“if setting”还是“if let setting”? 我把代码放在textFieldShouldReturn
方法里面,所以当用户按下键盘的返回按钮时,它会将第二个错误的数据插入到数据库中,我使用了“if let setting”跨度>
返回应该有一个真或假值(取决于你希望返回按钮做什么)。至于另一个错误,我忘了在guard
上添加返回。我的错。查看编辑。
很抱歉让您头疼,但我仍然面临第 15 行代码中的一个错误 guard let settingFetched = Setting.first else
,错误仍然显示“使用未解析的标识符设置”,我认为下面的这一行可以解决问题,对吧? let Setting = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [SettingData]
【参考方案2】:
对于您想要做的事情,Core Data 太过分了。
请改用NSUserDefaults
。轻松多了。
【讨论】:
我在ios开发方面有点天真,所以我不明白NSUserDefaults
如何解决我的问题。它可以帮助我做我想做的事吗?
只查类参考,超级简单。
这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
@Abubakr 达尔。不,实际上这是解决 OP 问题的最佳方法。他想用大炮压扁一只苍蝇。我告诉他使用更有用的工具。打这个电话的专业知识是什么?
您的答案的本质可能是正确的,但肯定还不够。也许如果你指出他为什么不应该使用 Coredata 而使用 NSUserDefaults。如果可能,您还应该提及 UserDefaults 的缺点。以上是关于如何使用 core-data 存储一个值? (迅速 2)的主要内容,如果未能解决你的问题,请参考以下文章
在同一个数据库上同时使用 core-data 和基于 sqlite c 的 api
Core-Data:想要将新的 web xml 内容持久保存到我的数据存储中,而不是替换现有的
IOS/objective-c/core-data:如何从相关实体获取属性