在 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 中
如何将日期类型保存到 Swift Core Data 中实体的属性?
如何将用户登录的 JSON 响应保存到 Core Data 中以跟踪 Swift 中的用户状态?