slo*_*ker 38 core-data ios swift
我不确定我在这里做错了什么,但是当我第一次保存到coredata时,它运行得很好.当我试图覆盖它时,它没有.
func testStuff() {
var token = loadLoginData()
println("Token \(token)")
saveLoginData("New Token")
var newToken = loadLoginData()
println("Token \(newToken)")
}
func saveLoginData(accessToken: String) {
var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context: NSManagedObjectContext = appDel.managedObjectContext!
// save data to core data
var loginData = NSEntityDescription.insertNewObjectForEntityForName("LoginData", inManagedObjectContext: context) as NSManagedObject
loginData.setValue(accessToken, forKey: "accessToken")
context.save(nil)
println("Done saving user")
}
/* Output
Token Optional("12345")
Done saving user
Token Optional("12345")
*/
Run Code Online (Sandbox Code Playgroud)
加载登录数据启用调用saveLogin数据的函数
func loadLoginData() -> String? {
var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context: NSManagedObjectContext = appDel.managedObjectContext!
var request = NSFetchRequest(entityName: "LoginData")
request.returnsObjectsAsFaults = false
var results: NSArray = context.executeFetchRequest(request, error: nil)!
if (results.count > 0) {
var userData: NSManagedObject = results[0] as NSManagedObject
var accessToken: String = userData.valueForKey("accessToken") as String
return accessToken.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
} else {
println("0 results returned, potential error")
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
Hen*_*ijn 55
由于batchupdate在更大的数据块中更有用,我认为这是一种更微妙的方法.
func saveLoginData(accessToken: String, userName: String) {
var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context: NSManagedObjectContext = appDel.managedObjectContext!
var fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "LoginData")
fetchRequest.predicate = NSPredicate(format: "userName = %@", userName)
if let fetchResults = appDel.managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [NSManagedObject] {
if fetchResults.count != 0{
var managedObject = fetchResults[0]
managedObject.setValue(accessToken, forKey: "accessToken")
context.save(nil)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我没有弄错的话,我试着将它翻译成你的情况,但是没有测试过.
fetchRequest.predicate基本上使用您在调用函数时输入的(用户)名称userName在实体上设置属性的过滤器LoginData.假设在此示例中,您只有一个username具有相同名称.然后它fetchrequest使用给定的过滤器执行a ,因此您可以setValue使用accesToken在调用函数时输入的值来更改它的值.以下代码:if fetchResults.count != 0仅在username存在时执行.
Car*_*ano 11
斯威夫特 5
您可以创建一个可以同时用于包含和更新的方法。假设您entity在 CoreData 上创建了一个名称为Users:
var context: NSManagedObjectContext {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.persistentContainer.viewContext
}
Run Code Online (Sandbox Code Playgroud)
let user: Users!
let fetchUser: NSFetchRequest<Users> = Users.fetchRequest()
fetchUser.predicate = NSPredicate(format: "id = %@", id as String)
let results = try? context.fetch(fetchUser)
if results?.count == 0 {
// here you are inserting
user = Users(context: context)
} else {
// here you are updating
user = results?.first
}
user.id = id
user.name = name
...
try context.save()
Run Code Online (Sandbox Code Playgroud)
Dev*_*t10 10
更新了Swift 4和XCode 9.2
回答你的问题......
如何更新已在Swift中保存的CoreData条目?
你首先需要获得你的AppDelegate和viewContext.然后,您需要为NSFetchRequest您要更新的实体设置一个,在我的示例中将是"Alert".然后设置您的提取以查找您要查找的结果.在示例中,我的结果通过创建日期和警报类型找到警报.
进一步阅读如何使用谓词进行查询. Stack Overflow示例和 Apple文档
然后context.fetch(fetchRequest),我将结果设置为我想要更新的值,并在try catch中处理错误.最后我context.save().
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Alert")
fetchRequest.predicate = NSPredicate(format: "creationDate = %@ AND alertType = %&",
argumentArray: [creationDate, alertType])
do {
let results = try context.fetch(fetchRequest) as? [NSManagedObject]
if results?.count != 0 { // Atleast one was returned
// In my case, I only updated the first item in results
results[0].setValue(yourValueToBeSet, forKey: "yourCoreDataAttribute")
}
} catch {
print("Fetch Failed: \(error)")
}
do {
try context.save()
}
catch {
print("Saving Core Data Failed: \(error)")
}
Run Code Online (Sandbox Code Playgroud)
Swift> = 2该方法现在返回一个非可选项并在错误情况下抛出一个错误,必须使用try-catch处理:
let context = self.fetchedResultsController.managedObjectContext
let entity = self.fetchedResultsController.fetchRequest.entity!
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName:entity.name!)
fetchRequest.predicate = NSPredicate(format: "notificationId = 13")
do {
let list = try context.executeFetchRequest(fetchRequest) as? [NSManagedObject]
if list!.count == 0 // Check notificationId available then not save
{
let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name!, inManagedObjectContext: context)
newManagedObject.setValue("This is first message13", forKey: "message")
newManagedObject.setValue(1, forKey: "appId")
newManagedObject.setValue(13, forKey: "notificationId")
newManagedObject.setValue("First one", forKey: "tital")
}
// success ...
} catch let error as NSError {
// failure
print("Fetch failed: \(error.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)
Dej*_*dar -1
有一个名为“批量更新”的新功能。
我认为这篇文章会对您有所帮助:
http://www.bignerdranch.com/blog/new-in-core-data-and-ios-8-batch-updating/
基本上,您要做的就是使用NSBatchUpdateRequest代替NSFetchRequest,使用 过滤结果NSPredicate,更改结果中的值,然后保存数据。
另一个 swift 教程:
http://code.tutsplus.com/tutorials/ios-8-core-data-and-batch-updates--cms-22164
| 归档时间: |
|
| 查看次数: |
61041 次 |
| 最近记录: |