Swift删除CoreData数据行:如何将查询结果转为NSManagedObject?
解决CoreData删除数据时的NSManagedObject类型转换问题
嘿,我来帮你搞定这个CoreData删除数据的问题!你已经成功查到目标数据了,差的最后一步就是把查询结果转换成NSManagedObject类型(其实你的Posts实体类本身就是它的子类),这样就能传给context.delete()方法完成删除了。
问题根源
你现在的fetchRequest用的是NSFetchRequest<NSFetchRequestResult>,所以fetch返回的结果是[Any]类型,没法直接传给delete方法。而你的Posts类是继承自NSManagedObject的,只要把查询结果转成Posts类型就行,这里有两种简单的解决方法:
方法1:直接指定FetchRequest的泛型类型(推荐)
这是最简洁的方式,直接让fetch请求返回Posts类型的数组,不用额外做类型转换:
func deleteElement(postUid: String) { let appDel = UIApplication.shared.delegate as! AppDelegate let context = appDel.persistentContainer.viewContext // 直接指定泛型为Posts,而非通用的NSFetchRequestResult let fetchRequest = NSFetchRequest<Posts>(entityName: "Posts") let predicate = NSPredicate(format: "postUid == %@", postUid as CVarArg) fetchRequest.predicate = predicate do { let result = try context.fetch(fetchRequest) print("Result \(result)") // 如果postUid是唯一标识,取第一个元素即可;否则遍历所有匹配项 if let targetPost = result.first { context.delete(targetPost) // 这里targetPost就是NSManagedObject子类,可直接传入 } // 必须调用save,删除操作才会持久化到本地 try context.save() print("数据删除成功!") } catch { print("删除失败:\(error)") } }
方法2:手动转换查询结果
如果你不想修改fetchRequest的泛型设置,也可以手动把结果转换成Posts类型:
func deleteElement(postUid: String) { let appDel = UIApplication.shared.delegate as! AppDelegate let context = appDel.persistentContainer.viewContext let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Posts") let predicate = NSPredicate(format: "postUid == %@", postUid as CVarArg) fetchRequest.predicate = predicate do { let result = try context.fetch(fetchRequest) print("Result \(result)") // 将Any类型的结果数组强转为[Posts] if let posts = result as? [Posts] { for post in posts { context.delete(post) } try context.save() print("数据删除成功!") } } catch { print("删除失败:\(error)") } }
关键注意点
- 你的
Posts实体类默认就是NSManagedObject的子类(CoreData生成实体时自动配置),所以不需要额外继承处理 - 删除操作执行后,一定要调用
context.save(),否则删除只会在内存中生效,不会写入本地存储 - 如果
postUid是数据的唯一标识,直接取result.first删除即可,无需遍历整个数组
内容的提问来源于stack exchange,提问作者Ali Ihsan URAL
相关产品推荐
相关产品推荐

