【问题标题】:Save contents of NSMutableArray to file [duplicate]将 NSMutableArray 的内容保存到文件 [重复]
【发布时间】:2014-01-05 08:56:04
【问题描述】:

我有一个包含多个ViewControllers 的应用程序。每个ViewController 都有一个问题,其中有2-5 个buttons 作为可能的答案。按钮的标题保存到名为submissionNSMutableArray。用户可以返回之前的问题,更改他们的答案,NSMutableArray 将相应更新。我需要将此数组保存到文件中,以便每次完成调查问卷时都可以将新结果保存到UITableView。我进行了研究,听起来 .plist 是一个不错的选择,因为我在数组中的所有对象都是 NSStrings

我的数组样本:

2013-12-17 14:06:34.210 Questionnaire[1724:70b] (
    1234,
    "Dec 17, 2013",
    Yes,
    Games,
    "Not Applicable",
    Yes
)

“1234”是用户ID,日期是出生日期,其他提交的是每个问题的答案。

我的 ViewController 如下所示:

MainViewController
InfoViewController <-- Array allocated + initialised, inserting ID and DoB
Q1ViewController <-- question
..
Q4ViewController <--question
ENDViewController <-- offers user options for Home or Results
ResultsViewController <-- UITableView ordered by User ID
SavedResultsViewController <-- UITableView showing complete submission

NSMutableArray 通过每个 ViewController 传递。

我的问题:哪种保存到文件的方法最适合我的需要? (.plist、文件类型等)。在 Excel 上查看结果会很好(但不是必需的)。保存应该在哪里进行?我在想当最后一个对象被插入到 Q4 ViewController 的数组中时,所以当弹出 ENDViewController 时它将被保存到文件中,这是合乎逻辑的吗?我需要创建一个新的Objective-C 文件来存储数据吗?我看过一些解释这一点的教程,在单独的NSObject 文件中声明每个对象,尽管我不确定是否需要这样做,因为我的对象已经存储在数组中。

您可能已经猜到我对 Objective-C 和 iOS 编程很陌生,因此非常感谢您提供的任何帮助。我不知道如何描述我的问题,如果问题仍然不清楚,请道歉。

编辑:自从创建这篇文章以来,我对 Objective-C 有了更多的了解,并决定将我的数据保存到 .csv 文件中。此文件仅用于发送电子邮件,它不会显示在UITableView 上(我目前正在为此实施Core Data)。这个解决方案将来可能会对某人有所帮助,所以这里是:

// Set column titles for .csv
NSArray *columnTitleArray = @[@"User ID", @"DoB", @"Question 1", @"Question 2", @"Question 3", @"Question 4"];

NSString *columnTitle = [columnTitleArray componentsJoinedByString:@","];
NSString *columnTitleToWrite = [columnTitle stringByAppendingString:@"\n"];

// Separate submissions from array into cells
NSString *questionResults = [self.submission componentsJoinedByString:@","];
NSString *questionResultsToWrite = [questionResults stringByAppendingString:@"\n"];

// Find documents directory
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
// Set file name and type
NSString *survey = [docPath stringByAppendingPathComponent:@"result.csv"];
// Create new file if none exists
if (![[NSFileManager defaultManager] fileExistsAtPath:survey]){
    [[NSFileManager defaultManager] createFileAtPath:survey contents:nil attributes:nil];

    // Set column titles for new file
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:survey];
    [fileHandle writeData:[columnTitleToWrite dataUsingEncoding:NSUTF8StringEncoding]];
}

NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:survey];
[fileHandle seekToEndOfFile];
[fileHandle writeData:[questionResultsToWrite dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandle closeFile]; 

【问题讨论】:

  • 为简单起见,您可以先保存到 plist。为此,请查看this guide
  • 我尝试通过 Apple 文档来学习它,但我总是发现它的编写方式假设读者是 Objective-C 中的优秀程序员。我一直在尝试研究更多对初学者友好的教程,你认为我可以在我的代码中实现它吗? - gist.github.com/hollance/6328192

标签: ios objective-c memory-management nsmutablearray plist


【解决方案1】:

您可以使用标准 NSCoding 协议来保存数据,但在这种情况下,您无法在 excel 中读取它。 或者您可以将其保存在 xml 中。 或者您可以手动创建一个 csv(逗号分隔值)文件并在任何地方打开它。 无论如何,实施取决于你:)

【讨论】:

    【解决方案2】:

    您可以将数组保存为 JSON 文件。这将允许您在文本编辑器中查看它,但不能在电子表格中查看。以下代码会将其作为 JSON 写入文件:

    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"yourdata.json"];
    NSError *e = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:yourdata options:NSJSONWritingPrettyPrinted error:&e];
    
    if (jsonData) {
        [jsonData writeToFile:url.path atomically:YES];
    }
    

    您还可以将数据保存为 plist 文件。以下将数据写入plist:

    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"yourdata.plist"];
    NSError *e = nil;
    NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:yourdata format:NSPropertyListXMLFormat_v1_0 options:0 error:&e];
    
    if (plistData) {
        [plistData writeToFile:url.path atomically:YES];
    }
    

    Plists 可以保存为二进制或 XML 格式,上面将其保存为 XML 格式,这意味着 XML 也可以用文本编辑器读取。同样,这不会作为电子表格查看。如果您想以 CSV 格式导出数据,您可能必须编写自己的代码来输出它。

    【讨论】:

    • 好的,我会尝试这两种方法,看看哪种最适合。在 Q4ViewController 的 viewDidLoad 方法中,我应该在哪里实现此代码?还是应该有自己的方法?抱歉,我对 iOS 编程真的很陌生,谢谢。
    • 你可以把它放在任何对保存信息合乎逻辑的地方。我需要从整体上查看您的代码,看看在哪里调用它最有意义。但是至于将这段代码放在自己的方法中,这是有道理的,特别是如果您想将数组或字典编码到方法中,如果您想在代码中的不同位置调用它。
    • 太棒了,非常感谢!我能够毫无问题地将其保存到 .plist 中。现在我要实现一个功能来通过电子邮件发送 .plist。我现在唯一的问题是它显示的格式,即。项目 0、项目 1 等。有没有办法改变这些值?感谢您的帮助!
    • 我试图编辑我的评论,但不幸的是我太晚了。我的另一个问题是:每次完成并重新启动问卷时,.plist 都会被新的 .plist 覆盖,如果我要通过电子邮件发送结果,这个功能很好,但是有没有办法将新结果添加到相同的结果中.plist 文件每次?因为理想情况下我想在 UITableView 中显示过去的结果。目前我正在显示 NSMutableArray 的结果,但我想显示过去提交的内容,允许用户选择一个。我应该为这个问题开始一个新线程吗?谢谢。
    • 可能。我会说这是一个新问题,因为它处理的是读取 plist 文件,而不是写入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多