在 Swift 中的 Core Data 中保存数据

Posted

技术标签:

【中文标题】在 Swift 中的 Core Data 中保存数据【英文标题】:Save data in Core Data in Swift 【发布时间】:2016-12-20 00:48:14 【问题描述】:

我目前正在将一个 Objective C 应用程序更新为 Swift 3。如何保存与从前一个表传递的对象关联的输入数据? Objective C 应用程序运行良好,但我不知道 Swift 3 的等效语法是什么。

Objective C 代码是:

- (void)insertNewObject:(NSString*) strRain;

NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
Rainfall *altRainfall = (Rainfall*)[NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

altRainfall.gauge = strRain;
altRainfall.primaryGauge = self.detailItem;
altRainfall.dateRecorded = todaysDate;
altRainfall.sortDate = [NSDate date];

NSError *error = nil;
if (![context save:&error])

    NSDictionary *dict = [error userInfo];
    NSString *errMsg = [dict valueForKey:@"errMessage"];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Note" message:errMsg delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];

    [alert show];

    [self.managedObjectContext deleteObject:altRainfall];

Swift 3 代码是:

    func save(strRain: String) 

    let entity = NSEntityDescription.entity(forEntityName: "Rainfall", in: coreDataStack.context)!
    let newRainfall = NSManagedObject(entity: entity, insertInto: coreDataStack.context)
    newRainfall.setValue(strRain, forKeyPath: "gauge")
    newRainfall.setValue(todaysDate, forKeyPath: "dateRecorded")
    newRainfall.setValue(sortDateItem, forKeyPath: "sortDate")


    print(strRain)
    print(todaysDate)
    print(sortDateItem)

    do 
        try coreDataStack.context.save()
     catch let error as NSError 
        print("Could not save. \(error), \(error.userInfo)")
    

那么,如何将 altRainfall.primaryGauge = self.detailItem 替换为 Swift 中的内容?

【问题讨论】:

为什么要将所有newRainFall.someProperty = someValue 行转换为newRainFall.setValue(someValue, forKeyPath: "someKey") 我尝试了 newRainfall.gauge = strRain 等,但出现错误,因此切换到 forKeyPath 方法。 【参考方案1】:

用于保存和更新数据。

 func saveToDataBase(data:[TestData])
        for data1 in data

            let request:NSFetchRequest<TestData> = TestData.fetchRequest()
            do 
                let count = try managedObjectcontext.count(for: request)
                if count == 0 
                    // save data according to your requirement.
                    print(data1)
                else

                    //if anything you want to update then wright here
                

            catch
                let error  = error as NSError
                print("\(error)")
            
        
    

您可以这样做来检索数据。

func retriveSaveData()

    let request:NSFetchRequest<TestData> = TestData.fetchRequest()
    do 
        let data = try managedObjectcontext.fetch(request) as [TestData]

        if let str = data.first?.name
            // Your retrieve data
            print(str)
        
    catch
        let error  = error as NSError
        print("\(error)")
    

希望对您有所帮助。如果您去看 coredata manager,那么我已经制作了示例项目。 project sample

【讨论】:

【参考方案2】:

答案如此显而易见!我错过的那一行是:

newRainfall.setValue(selectedGauge, forKeyPath: "primaryGauge")

这会将数据与从前一个视图传递的仪表名称相关联。很明显,我质疑为什么我还在努力学习。也许只是为了创建新的神经网络来延缓衰老。

【讨论】:

以上是关于在 Swift 中的 Core Data 中保存数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Documents 文件夹中保存 UIImagePicker 中的 UIImage 并获取路径字符串以保存在 Swift 中的 Core Data 中

Core Data 使用 Swift 保存数据

如何将日期类型保存到 Swift Core Data 中实体的属性?

如何将用户登录的 JSON 响应保存到 Core Data 中以跟踪 Swift 中的用户状态?

如何在 Swift 中将可转换属性保存到 Core Data

在 Swift 的 Core Data 中保存自定义类