CoreData 删除单个对象
Posted
技术标签:
【中文标题】CoreData 删除单个对象【英文标题】:CoreData delete single object 【发布时间】: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/***_Question.png?dl=0
【问题讨论】:
【参考方案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"
存储在name
和markedCell
中。但我只想删除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
【讨论】:
以上是关于CoreData 删除单个对象的主要内容,如果未能解决你的问题,请参考以下文章