如何持久化一个NSMutableArray

3

我对iOS开发完全不了解。

我从Apple开发者网站上开始了一个非常有用的教程。

我按照指示制作了一个简单的待办事项列表应用程序。

应用程序:它是一个简单的待办事项列表。它有一个视图,带有一个单一的文本字段,该字段接受输入,然后将该输入附加到表格列表视图中。表格列表视图是我的“待办事项列表”,它由NSMutableArray生成。

问题:每当我退出并重新启动应用程序时,我的列表都会消失。

问题:我需要一种方法来保持存储我的列表的NSMutableArray * ToDoList

所以,是否可以保留列表?还是必须使用某种数据存储方式?我在提问之前进行了一些研究,并阅读了关于在'NSUserDefaults'中存储列表的内容 - 但问题是,NsUserDefaults只返回一个不可变对象

  1. 我们可以保留NsMutable List吗?如果可以,如何保留?

  2. 是否需要使用NSUserDefaults?为什么?

  3. 如果(2)是正确的,那么如何使NsUserDefaults返回的不可变对象可变?

我再次告诉你,我唯一的iOS开发经验来自教程。所以,如果您能将其简化到最简单的形式,我会很感激。

谢谢。


1
NSMutableArray *array = [[[NSUserDefaults standardUserDefaults]objectForKey:@"key"]mutableCopy] - Neil Galiaskarov
2
我不建议使用NSUserDefaults,因为待办事项列表应该在您的应用程序中扩展,并且您可能希望对这些对象执行多个操作。每次从userDefaults获取数据对我来说似乎不是一个好方法。 - Prince Agrawal
核心数据。现在学习它——你以后会感激它的。 - Abizern
4个回答

3

1) 如果你只是想保存一个NSMutableArray,那么可以使用NSUserDefaults

2) 如果你不想处理Core Data并设置一个适当的数据结构,那么似乎这是唯一的选择。

3) 当你从一个NSArray *array获取一个NSMutableArray时,只需使用[array mutableCopy]


1
这不是唯一的选择,只要数组仅包含可转换为 plist 的对象,你可以将数组写入 plist。或者,你可以使你的自定义对象符合 NSCoding 协议,并使用 archiveDataWithRootObject: 将数组保存到磁盘文件中。 - Abizern

2
你最好选择CoreData。它非常易于实现和使用。
这里是最好的教程以入门
这里是苹果的Core Data编程指南 这里是为什么您应该选择Core-Data 尽管有其他不同的意见,但我建议您只使用Core Data。在XCode提供的可视化界面和大量的开发支持下,它看起来非常容易。
我反对使用NSUserDefaults,因为待办事项列表应该在您的应用程序中扩展,并且您可能希望对这些对象执行多个操作。每次从userDefaults获取数据对我来说都不是一个好方法。 为什么要使用NSUserDefaults: NSUserDefaults类提供了一个编程接口,用于与默认系统进行交互。默认系统允许应用程序根据用户的偏好自定义其行为。例如,您可以允许用户确定应用程序显示的测量单位或文档自动保存的频率。应用程序通过将值分配给用户默认数据库中的一组参数来记录此类首选项。这些参数被称为默认值,因为它们通常用于确定应用程序在启动时的默认状态或默认操作方式。
这里是Class Reference

1
这正是我所想的。一个待办事项清单会不断扩展,每次保存和检索似乎都是一个错误的概念。还有一个我想知道的观点,NSUserDefaults 究竟用于什么? - leo
如果您想要持久化一些用户设置,而且这些设置不经常更改,也不应该太庞大,那么您应该使用NSUserDefaults。 - Prince Agrawal
@Leo 我在我的回答中添加了更多关于NSUserDefaults的信息。如果您同意这些观点,请随意接受/点赞该答案。如果需要更多信息,请告诉我。干杯 :) - Prince Agrawal
另一个优点是,Core Data 允许您存储自定义对象,而在 NSUserDefaults 或磁盘上的 plist 中,您只能存储可转换为 plist 的对象。 - Abizern

1
简短的回答是使用NSArray的writeToURL:atomically:和arrayWithContentsOfURL:方法将您的数组写入到磁盘上的文件中,并从该文件中读取您的数组。更长的答案会证明它可能在哪里...现在我会跳到答案:“写入一个(仅限于您的应用程序)文件夹中的文件,位于'〜/ Library / Application Support /'文件夹中。(注意:我是OSX程序员...也许对于iOS应用程序有更好的地方...;-) 这是代码:
NSArray * array;    // <<== this is your array (I assume you've created it somewhere…)

// get the document directory URL
NSURL *documentsDirectoryURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentsDirectory inDomains:NSUserDomainMask] firstObject];


// append our file name
NSURL *url = [documentDirectoryURL URLByAppendingPathComponent:@"ToDo.data" isDirectory:NO];

#if WRITING_ARRAY
    // write our array to the file
    if (![array writeToURL:url atomically:YES]) {
        NSLog(@"Failed to writeToURL:'%@'", url);
    }
#else // READING_ARRAY
    // read (mutable) array from file
    array = [[NSArray arrayWithContentsOfURL:url] mutableCopy];
#endif

我已经编辑过了,使其更适合于iOS应用程序。 - Abizern
我正在使用上述代码来存储NSMutableArray,但是当我尝试从.data文件中检索数据时,我得到了nil。 - Kunal Shrivastava
Kunal Shrivastava:检查您的控制台,看看writeToURL是否发布了任何失败消息。为了双重确认,在writeToURL之后立即执行arrayWithContentsOfURL,并将读取的内容与写入的内容进行比较。显然,它们应该是相同的;如果不是,则再次检查控制台是否有错误消息。 - geowar

0

你最好使用Core Data或其他持久化方式,如FMDB。使用NSUserDefaults也可以,但NSUserDefaults的性能非常差。你可以使用NSUserDefaults来做演示,但对于最终的应用程序,强烈建议使用更好的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接