gpt4 book ai didi

ios - 核心数据——获取、排序和编辑/更新属性

转载 作者:行者123 更新时间:2023-11-29 01:17:17 25 4
gpt4 key购买 nike

所以我涉足了核心数据池,它确实是一个黑暗而神秘的池......

我有以下内容:

名为RAS的实体。

RAS 中存在以下属性:

  1. String 类型的rasIdentifier(非可选)
  2. rasAutoRetire 类型为 Bool(可选)
  3. rasAutoRetireDate 类型为 NSDate(可选)
  4. rasReassessmentDate 类型为 NSDate(可选)
  5. rasReassesmentDueNow 类型为 Bool(可选)
  6. rasAutoRetireDone 类型为 Bool(可选)
  7. rasReassessmentDone 类型为 Bool(可选)

当我第一次保存“记录”时,会发生以下情况:

  • 如果用户选择在未来的特定日期自动退出项目,则值设置如下:

  • rasIdentifier 获取唯一值。

  • rasAutoRetire 设置为 true
  • rasAutoRetireDate 设置为特定日期(例如 future 一周)。
  • rasReassessmentDate 留空
  • rasReassessmentDueNow 设置为 false
  • rasAutoRetireDone 设置为 false
  • rasReassessmentDone 设置为 false

  • 如果用户选择在未来的特定日期重新评估该项目,则值设置如下:

  • rasIdentifier 获取唯一值。

  • rasAutoRetire 设置为 false
  • rasAutoRetireDate 留空。
  • rasReassessmentDate 设置为特定日期。
  • rasReassessmentDueNow 设置为 false
  • rasAutoRetireDone 留空
  • rasReassessmentDone 设置为 false

从上面可以清楚地看出,一个项目在未来有两个选择:自动退役或重新评估。

为了检查一个项目是否已经达到并通过了它的重新评估日期,我已经开始编写以下函数,但是代码很笨拙,我一无所获,我真的很感谢这里的一些天才帮助......开始了:

func HandleItemsThatNeedReassessment() {

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedObjContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "RAS")
var error: NSError?

//Step 1: Check if database exists
let count = managedObjContext.countForFetchRequest(fetchRequest, error: &error)
if count == NSNotFound {

print("Database does not exist")

} else {

print("Database exists. Check now if there are any records.")

//Step 2: Check if there are any records in the database

do {

let results = try managedObjContext.executeFetchRequest(fetchRequest)
let varRecordsExist = results as! [NSManagedObject]

if varrecordsExist.count == 0 {

print("No records in the database")
//do nothing further!

} else {

print("Yes, there are \(varRecordsExist.count) records in the database.")

//Step 3: Select all the existing records that are due for reassessment (and leave those that are due for auto-retirement - for now)
//NO IDEA WHAT TO DO HERE!



//Step 4: Check which items are due for reassessment, but exclude those that have already been reassessed (rasReassessmentDone = true)
//NO IDEA WHAT TO DO HERE EITHER!



//Step 5: Because the reassessment date is in the past, change the valueForKey("rasReassessmentDueNow") to TRUE
if varIsAssessmentOverdue == true {
//NO IDEA WHAT TO DO HERE - AGAIN!

??SomethingHere??.setValue(true, forKey: "rasReassessmentDueNow")
//Do this for all items that needs reassessment

}

//Step 6: If any changes were made/values were changed in Step 5, SAVE those changes to Core Data
if managedObjContext.hasChanges {
do {
try managedObjContext.save()

//How do you save these changes???

} catch let error as NSError {
NSLog("Could not save \(error), \(error.userInfo)")
}
}

}

}

}

catch

let error as NSError {

print("Print error stuff here \(error)")

}

}
}

是的,尝试的代码很糟糕。我什至不知道我的步骤是否合乎逻辑。有可能一次性完成这一切吗?上面的很多内容对我来说都没有意义 - 尽管进行了数小时的谷歌搜索和阅读 - 并且非常感谢一种全面的解释。

顺便说一句,这个函数在应用程序的第一个 View Controller 的 viewDidLoad 中被调用,这就是为什么我在第 1 步和第 2 步中进行所有这些检查,否则如果没有记录。

最佳答案

一开始我不会检查数据库中是否有任何东西,我会直接跳到第 3 步。您只需要指定符合您要求的谓词,例如:

    //Step 3:  Select all the existing records that are due for reassessment (and leave those that are due for auto-retirement - for now)
//You could also combine it with Step 4 in the same predicate:
let predicate1 = NSPredicate(format: "%K == true AND %K == false AND %K = false", "rasReassessmentDueNow", "rasAutoRetire", "rasReassessmentDone")

现在像上面那样创建获取请求,将谓词添加到请求并运行它。

    fetchRequest.predicate = predicate1

do {

let results = try managedObjContext.executeFetchRequest(fetchRequest)
let records = results as! [NSManagedObject]
...

现在您有了一个包含对象的数组,您可以在此处检查计数属性以查看是否有任何数据。

在第 5 步中,只需枚举数组并检查 varIsAssessmentOverdue 是否为真。但老实说,我会向上面的谓词添加另一个预测,检查 varIsAssessmentOverdue 是否为真(..AND %K == true",.."varIsAssessmentOverdue"),在这种情况下你只有你想要的对象,你可以仅枚举数组并将值设置为所需的值,数组中的每个对象都是您要查找的对象<​​/p>

for ras in results {
// I don't understand what you are trying to do here, all of the items here will be true and you want to change it to true again?
ras.setValue(value, forKey: attribute)
}

保存您在代码中所做的更改。

主要将此代码视为伪代码,有些位需要进行小的修改,但您应该能够接受它。

这里的想法是尽可能少地访问数据库。您应该创建 NSPredicate,它只返回您想要的数据的结果,然后只需更改数据并保存即可。

关于ios - 核心数据——获取、排序和编辑/更新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35012410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com