@FetchRequest动态改变查询条件

352 阅读1分钟

一、实现通过传入id查询item的方法

struct EditItem: View {
    var fetchRequest : FetchRequest<EditSuit>  //这里只声名了一个fetchRequest, 后面在init中初始化
}

在init中初始化

init(suit: Suit){
        self.suit = suit
        imageModel = ImageModel(img: suit.img, armpx: suit.armpx)
        fetchRequest = FetchRequest<EditSuit>(
            entity: EditSuit.entity(),
            sortDescriptors: [],
            predicate: NSPredicate(format: "uuid == %@", suit.uuid)
        )
    }

这样使用

func checkSuit() -> Bool{
        //从coredata里取对应的皮肤
        guard let suitToEdit = fetchRequest.wrappedValue.first else {
            print("no \(suit.uuid) found")
            return false
        }

        //判断标题是否已经修改了
    ...
 }

二、需要修改coredata里的内容的时候

    func saveSuitName(suitName: String){
        //从coredata里取对应的皮肤
        guard let suitToEdit = fetchRequest.wrappedValue.first else {
            print("no \(suit.uuid) found")
            return
        }
        //修改名称
        suitToEdit.enName = suitName
        suitToEdit.cnName = suitName
        fetchRequest.update()   //这里会提示报错Cannot use mutating member on immutable value: 'self' is immutable
    }

其实可以不用那个

    func saveSuitName(suitName: String){
        //从coredata里取对应的皮肤
        guard let suitToEdit = fetchRequest.wrappedValue.first else {
            print("no \(suit.uuid) found")
            return
        }
        //修改名称
        suitToEdit.enName = suitName
        suitToEdit.cnName = suitName
        //fetchRequest.update()   //这里会提示报错Cannot use mutating member on immutable value: 'self' is immutable
        //直接保存managedObjectContext
        do {
            try self.managedObjectContext.save()
        } catch {
            print(#line, "save EditSuit error", error as NSError)
        }
    }

还需要在前面增加一下managedObjectContext声名

struct EditItem: View {
    var fetchRequest : FetchRequest<EditSuit>  //这里只声名了一个fetchRequest, 后面在init中初始化
    @Environment(\.managedObjectContext) var managedObjectContext  //在声名中增加这个, 保存coredata用
}

如果要用fetchRequest.update(),要在EditItem里用@FetchRequest来声明 fetchRequest, 以后遇到再研究。