核心数据条目未在 swift3 中正确更新
Core Data entries not updating correctly in swift3
我有一个核心数据条目,其中某些键和值存储在从 API 获取的数据库中。现在我想用更新后的值更新一些核心数据条目所以为此我使用如下代码:
func updateAllRecords(responseArray: [Dictionary<String, String>]) {
for settingsObject in responseArray {
if #available(iOS 10.0, *) {
let keys = settingsObject.flatMap() { [=10=].0 as? String }
let values = settingsObject.flatMap(){ [=10=].1 as? String}
let request = NSFetchRequest<ApplicationSettings>(entityName: "ApplicationSettings")
do {
let context = persistentContainer.viewContext
let searchResults = try context.fetch(request)
for settingsKeys in searchResults {
if keys.contains(settingsKeys.key!) {
settingsKeys.value = values[1]
try context.save()
}
}
} catch {
print ("There was an error")
}
} else {
}
}
}
}
我从 viewcontroller 调用这个函数是这样的:
var dicArray = [Dictionary<String, String>]()
let dic1 = ["IS_CIVIL_ID_MANDATORY": "Smith", "TIME_IN_MIN_BEFORE_ENABLING_START_TRIP": "Robert"]
dicArray.append(dic1)
CoreDataHandler.sharedInstance.updateAllRecords(responseArray: dicArray)
但是 table 中的条目没有正确更新密钥。它为两个键存储相同的值。见下文:
这段代码哪里错了?为什么为键存储相同的值?
你在这里弄错了
settingsKeys.value = values[1]
这里 1 是静态的
我认为你不需要单独的值数组
只需将此代码替换为我的代码
for settingsKeys in searchResults {
if keys.contains(settingsKeys.key!)
{
settingsKeys.updateValue(settingObject[settingsKeys.key!], forKey:settingsKeys.key!)
try context.save()
}
}
}
对于演示示例
func updateAllRecords(responseArray: [Dictionary<String, String>])
{
for settingsObject in responseArray
{
var dic2 = ["IS_CIVIL_ID_MANDATORY": "xyz", "TIME_IN_MIN_BEFORE_ENABLING_START_TRIP": "xyz"]
let keys = settingsObject.flatMap() {[=11=].0}
let values = settingsObject.flatMap(){[=11=].1}
let settingKeys = dic2.flatMap() {[=11=].0}
for settingsKey in settingKeys
{
dic2.updateValue(settingsObject[settingsKey]!, forKey: settingsKey)
}
print(keys)
print(dic2)
}
}
var dicArray = [Dictionary<String, String>]()
let dic1 = ["IS_CIVIL_ID_MANDATORY": "Smith", "TIME_IN_MIN_BEFORE_ENABLING_START_TRIP": "Robert"]
dicArray.append(dic1)
updateAllRecords(responseArray: dicArray)
输出
["TIME_IN_MIN_BEFORE_ENABLING_START_TRIP": "Robert", "IS_CIVIL_ID_MANDATORY": "Smith"]
我有一个核心数据条目,其中某些键和值存储在从 API 获取的数据库中。现在我想用更新后的值更新一些核心数据条目所以为此我使用如下代码:
func updateAllRecords(responseArray: [Dictionary<String, String>]) {
for settingsObject in responseArray {
if #available(iOS 10.0, *) {
let keys = settingsObject.flatMap() { [=10=].0 as? String }
let values = settingsObject.flatMap(){ [=10=].1 as? String}
let request = NSFetchRequest<ApplicationSettings>(entityName: "ApplicationSettings")
do {
let context = persistentContainer.viewContext
let searchResults = try context.fetch(request)
for settingsKeys in searchResults {
if keys.contains(settingsKeys.key!) {
settingsKeys.value = values[1]
try context.save()
}
}
} catch {
print ("There was an error")
}
} else {
}
}
}
}
我从 viewcontroller 调用这个函数是这样的:
var dicArray = [Dictionary<String, String>]()
let dic1 = ["IS_CIVIL_ID_MANDATORY": "Smith", "TIME_IN_MIN_BEFORE_ENABLING_START_TRIP": "Robert"]
dicArray.append(dic1)
CoreDataHandler.sharedInstance.updateAllRecords(responseArray: dicArray)
但是 table 中的条目没有正确更新密钥。它为两个键存储相同的值。见下文:
这段代码哪里错了?为什么为键存储相同的值?
你在这里弄错了
settingsKeys.value = values[1]
这里 1 是静态的
我认为你不需要单独的值数组 只需将此代码替换为我的代码
for settingsKeys in searchResults {
if keys.contains(settingsKeys.key!)
{
settingsKeys.updateValue(settingObject[settingsKeys.key!], forKey:settingsKeys.key!)
try context.save()
}
}
}
对于演示示例
func updateAllRecords(responseArray: [Dictionary<String, String>])
{
for settingsObject in responseArray
{
var dic2 = ["IS_CIVIL_ID_MANDATORY": "xyz", "TIME_IN_MIN_BEFORE_ENABLING_START_TRIP": "xyz"]
let keys = settingsObject.flatMap() {[=11=].0}
let values = settingsObject.flatMap(){[=11=].1}
let settingKeys = dic2.flatMap() {[=11=].0}
for settingsKey in settingKeys
{
dic2.updateValue(settingsObject[settingsKey]!, forKey: settingsKey)
}
print(keys)
print(dic2)
}
}
var dicArray = [Dictionary<String, String>]()
let dic1 = ["IS_CIVIL_ID_MANDATORY": "Smith", "TIME_IN_MIN_BEFORE_ENABLING_START_TRIP": "Robert"]
dicArray.append(dic1)
updateAllRecords(responseArray: dicArray)
输出
["TIME_IN_MIN_BEFORE_ENABLING_START_TRIP": "Robert", "IS_CIVIL_ID_MANDATORY": "Smith"]