【问题标题】:CoreData delete single objectCoreData 删除单个对象
【发布时间】:2015-05-04 15:22:38
【问题描述】:

我想删除实体Person 中属性name 中与值Test 匹配的条目。

例如,我将一个条目保存到核心数据中,如下所示:object.setValue("Test", forKey: "markedCell")。现在我想知道条目"Test" 是否保存在属性markedCell 中以及它具有哪个indexPath。我尝试了以下一个:

var request:NSFetchRequest = NSFetchRequest(entityName: "Person") request.predicate = NSPredicate(format:"markedCell = %@", "Test") var results : [NSManagedObject] = context.executeFetchRequest(request, error: nil) as [NSManagedObject]

现在我知道条目 "Test" 是否存在但不知道它有哪个 indexPath(如果我知道它有哪个 indexPath 正确,我只能删除一个条目?)。目前我想删除条目"Test"(不想将其设置为"")。

我的 CoreData 模型:

我想从markedCell 中删除"Test"

你们中有人知道如何在 Swift 中做到这一点吗?

创建一个单元格 (cellForRowAtIndexPath):

//Get task
    let context = self.fetchedResultsController.managedObjectContext
    let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
    var taskString:NSString?
    taskString = object.valueForKey("name") as? String
    cell.textLabel!.text = object.valueForKey("name") as? String

    println(object.valueForKey("name") as? String)

    //Set accessory type
    var request:NSFetchRequest = NSFetchRequest(entityName: "Person")
    request.predicate = NSPredicate(format:"markedCell = %@", taskString!)
    var results : [NSManagedObject] = context.executeFetchRequest(request, error: nil) as [NSManagedObject]
    if (results.count > 0) {
        //Element exists
        cell.accessoryType = UITableViewCellAccessoryType.None
        println("Cell isn't marked")
    }
    else {
        //Doesn't exist
        cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
        println("Cell is marked")
    }

崩溃:

我希望这张照片有助于更好地理解我的问题。图片链接:https://www.dropbox.com/s/h5g4yeoedg0xjjv/Stackoverflow_Question.png?dl=0

【问题讨论】:

    标签: ios swift core-data xcode6


    【解决方案1】:

    如果我知道它的 indexPath 是正确的,我只能删除一个条目?

    这是错误的。 Core Data 对象没有索引路径。 (获取结果控制器管理核心数据对象以进行显示 在表格视图中,然后您有索引路径,但这完全是 在这里无关紧要。)

    只需获取要删除和删除的对象或对象 他们:

    let request = NSFetchRequest(entityName: "Person")
    request.predicate = NSPredicate(format:"markedCell = %@", "Test")
    if let results = context.executeFetchRequest(request, error: nil) as? [NSManagedObject] {
    
        // Delete _all_ objects:
        for object in results {
            context.deleteObject(object)
        }
    
        // Or delete first object:
        if results.count > 0 {
            context.deleteObject(results[0])
        }
    
    } else {
        // ... fetch failed, report error
    }
    

    【讨论】:

    • 好的。因此,如果我删除第一个对象,它就是对象Test,如果我删除所有标记为空的对象?
    • @horst:获取请求使用“markedCell == Test”获取所有对象(可能有很多)。如果你知道只有一个匹配的对象没关系,否则你必须选择是要删除one还是all匹配对象。
    • 好的。现在"Test" 也在name 中被删除。我只想在markedCell 中删除它(我用图片更新了我的问题)。
    • @horst:我不明白你的意思。上面的代码删除了“markedCell == Test”的对象(或所有对象)。它会删除对象及其所有属性。
    • 我将"Test" 存储在namemarkedCell 中。但我只想删除markedCell中的"Test"。在name"Test" 中应该保留。
    【解决方案2】:

    对于 Swift 3:

           if let dataAppDelegatde = UIApplication.shared.delegate as? AppDelegate {
    
    
                    let mngdCntxt = dataAppDelegatde.persistentContainer.viewContext
    
                    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ItemCart")
    
                    let predicate = NSPredicate(format: "itemId = %i", Int(currentItemID)!)
                    print(currentItemID)
    
                    fetchRequest.predicate = predicate
                    do{
                        let result = try mngdCntxt.fetch(fetchRequest)
    
                        print(result.count)
    
                        if result.count > 0{
                            for object in result {
                                print(object)
                                mngdCntxt.delete(object as! NSManagedObject)
                            }
                        }
                    }catch{
    
                    }
                }
    

    【讨论】:

      猜你喜欢
      • 2013-01-11
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多