【问题标题】:Check to see if an item has already been saved to CoreData检查项目是否已保存到 CoreData
【发布时间】:2018-02-02 10:01:07
【问题描述】:

我正在将项目保存到收藏夹并在 tableView 中检索它们。但是现在用户可以添加这些项目的副本。我试图通过检查该项目是否已存在于 CoreData 中来避免这种情况,因此防止该项目再次被保存。我怎样才能做到这一点

var item: ItemModel?

    func saveItemsToCoreDataStack(completion: @escaping ()-> Void) {
        managedObjectContext!.perform {
            do {
                try self.managedObjectContext?.save()
                completion()
                print("Item saved to Database")
            } catch {
                print("Sorry Coudn't save itemto Database \(error.localizedDescription)")
            }
        }
    }



var items = [Item]()

var managedObjectContext: NSManagedObjectContext? {
        return (UIApplication.shared.delegate as! AppDelegate ).persistentContainer.viewContext
}

var fetchResultController: NSFetchedResultsController<Item>!

func retrieveitemsFromDatabase() {
        fetchItemFromCoreData { (items) in
            if let item = items {
                self.items = item
                self.tableView.reloadData()
            }
        }
    }

    func fetchItemFromCoreData(completion: ([Item]?)-> Void) {
        var results = [Item]()
        let request: NSFetchRequest<Item> = Item.fetchRequest()
        do {
            results = try managedObjectContext!.fetch(request)
            completion(results)
        } catch {
            print("Sorry couldn't fetch item from Database \(error.localizedDescription)")
        }
    }

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    这是一个解决方案,您可以通过它防止重复记录进入您的核心数据

    Swift 4.0

            let entityForTableName = NSEntityDescription.entity(forEntityName: "EntityName", in: managedObjectContext)
            let fetchRequest = NSFetchRequest<NSFetchRequestResult>()
    
            // Predicate with value which are you wan't to be repeated i.e server_id, item_id etc.
            let predicate = NSPredicate.init(format: "yourUniqueKey == %@", <YourUniqueValue>)
            fetchRequest.predicate = predicate
            fetchRequest.entity = entityForTableName
    
            do {
                let arrData = try managedObjectContext.fetch(fetchRequest)
    
                if arrData.count > 0 {
                    print("Record already exist")
                } else {
                    // Write your code here to add record
                }
    
            } catch {
                print(error.localizedDescription)
            }
    

    客观 C

            // Solution for objective c also
            NSEntityDescription *yourEntityObject = [NSEntityDescription entityForName:@"YourEntityName" inManagedObjectContext:_managedObjectContext];
            NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
            [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"uniqueField == %d", <ValueToCheckAlreadyExist>];
            [fetchRequest setEntity:yourEntityObject];
    
            NSArray *arrData = [_managedObjectContext executeFetchRequest:fetchRequest error:nil];
    
            if ([arrData count] > 0) {
            // Data already exist
            } else {
            // Create new data
            }
    

    【讨论】:

    • 谢谢队友,但这不起作用,在这里找到解决方案stackoverflow.com/questions/30894026/…
    • 我可以理解这是有效的解决方案,但上述解决方案也适用于手动重复记录检查的情况,我已经将此类解决方案应用到我的项目中。
    • 如果您也能接受我的回答,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 2014-01-14
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2014-10-27
    • 2016-01-20
    相关资源
    最近更新 更多