我应该使用 NSUserDefault、字典、核心数据还是其他什么?

Should I use NSUserDefault, dictionaries, core data - or something else?

我正在制作的应用程序有一些问题,我认为用一些照片可以更容易解释,所以......:

当然是 nr 中的 "Create New Person-button"。 1 带你到第二位。

现在,我在弄清楚如何保存有关 "People Diary" 中此人的数据时遇到了问题。目标是,当你输入一个人的名字,添加一张照片(一个 enable-camera 功能,我稍后会努力......)并添加问题的答案 - 然后你只需要按"Save this person",然后您将被重定向到 AllPersonsInYourDiaryViewController,其中现在有一个新的 tableViewCell,其中包含这个新人的名字(可能还有一个包含答案的副标题和单元格中显示的微型照片)。

(当然,您也可以在此单元格中输入此人的相关数据 - 但接下来会出现。)

到目前为止,在应用程序中,我使用了 NSUserDefault,当允许用户通过名称 "Antons Diary" 和特定问题等创建此特定日记时。但现在我注意到,也许使用其他东西更聪明?我试过字典,但无法正常工作。

所以...:在我花几个小时尝试其中一种方法之前,比我聪明的人能告诉我最好的方法是什么吗?

我可以告诉你 coreData 和 NSUserDefaults 背后的逻辑,但你将决定应该使用哪一个。

CoreData 通常用作数据库。您可以为每个实体创建实体和属性。此外,您可以在这些实体之间创建关系。 从 coreData 中提取数据时,您可以使用 NSSortDescriptor 或 select 排列此数据,使用 NSPredicate 特定记录。 所以你可以看到 CoreData 是一个数据库。

而 NSUserDefaults 通常用于保存密码、用户名、用户 ID... 以及您将在应用程序中经常使用的此类问题。 NSUserDefaults 让你可以随时直接访问保存的变量。但是,CoreData 将花费更多时间和代码行来访问实体并进行查询。

现在,检查哪种方法更适合您的情况。

如果我能给我两分钱,你要做的第一件事就是“设计”如何以编程方式表示一个人。您可以创建结构或 class 来执行此操作,即使结构更合适:

struct Person {
    var name: String?
    var answer: String?
    var photo: String?
}

然后你可以决定如何持久保存这样一个对象的数据。如果你想使用数据库,那么我建议使用带 FMDB library 的 SQLite。学习如何使用它非常简单快捷,而且非常方便。我已经在大型项目中使用过它并且运行顺利。根据您的需要,我发现 CoreData 过于复杂和矫枉过正。

如果您不想使用数据库,唯一的另一种方法是保存到文件,但是,您在这里也有其他选择。如果你编码(参见 Swift 中的 Codable 协议),你可以使用 NSKeyedArchiver 转换为 Data 对象然后写入磁盘。如果您喜欢使用字典,并且由于您要为一个人拥有的属性不会太多,您可以通过分配属性及其值来创建字典,然后转换并另存为 JSON 数据,甚至 Plist 文件。在这里没有任何推广的意图,只是提供一些额外的帮助,如果你想要我写的take a look to a library,它可以自动为你完成所有这些。这是您必须采用的协议,然后您可以立即将您的结构转换为字典、JSON 或 plist 并保存到文件。

无论您选择哪种方式select,都将图像作为单个文件保存到documents 目录,并且只将它们的文件名存储到database/file。基于它们,您可以在需要时轻松构建每个图像(或 URL)的路径。 警告:不要保存文档目录的完整路径,尤其是在模拟器上进行测试时;每个版本的路径都在变化。仅保存文件名。

此外,如果您要使用如上所示的结构,您可以实现小而超级方便的函数,这些函数将负责保存、加载或更新您的数据到解决方案 (database/file) 你最终会 select。这样一来,您就会将相关内容集中在一个地方,并且易于访问(即 person.save())。

struct Person {
    var name: String?
    var answer: String?
    var photo: String?

    func save() {
        …
    }

    func load() {
        …
    }

    // More functions…
}

最后,避免使用 UserDefaults,或者至少在那里保留一些非关键数据。 UserDefaults 并不意味着保留您的应用程序生成的所有数据。最重要的是,不要用它来保存敏感数据,尤其是密码或其他类似的东西。

以上内容希望对您有所帮助。