如何更新已在Swift中保存的CoreData条目?

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)

  • 实体名称应该是单数:“Users”-&gt;“User”。 (6认同)

Dev*_*t10 10

更新了Swift 4和XCode 9.2

回答你的问题......

如何更新已在Swift中保存的CoreData条目?

你首先需要获得你的AppDelegateviewContext.然后,您需要为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)


Mit*_*iya 9

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