编辑 plist 文件(目标 c)

Posted

技术标签:

【中文标题】编辑 plist 文件(目标 c)【英文标题】:Editing plist file(objective c) 【发布时间】:2015-12-24 18:10:29 【问题描述】:

我是 Objective C 的新手,目前正在开发一个 iphone 应用程序。我的应用程序需要获取用户输入(字符串)并存储它们,所以我使用 plist 来存储数据。目前,我可以从 plist 文件中读取。但是,当我尝试写入 plist 文件时,文件本身根本没有改变。

我想要做的是将用户的输入附加到现有的 plist 文件中。所以我读取了 plist 文件并将数组存储到 mutableArray。然后,我使用 addObject 函数将新的用户输入附加到 mutableArray 的末尾。到目前为止,一切正常,而 mutableArray 正是我想要的。最后一步对我不起作用:

[mutableArray writeToFile:[self dataFilePath] atomically:YES];

我假设我的 plist 文件(与 .h 和 .m 文件一起位于我的资源文件夹中)应该在执行此行后更改,并且应该附加新的用户输入,但该文件似乎没有完全改变。

我看过有人说我应该将plist文件从NSBundle复制到Documents目录,因为plist文件在资源文件夹中,但是在youtube上几乎所有的教程中,都没有出现过这样的问题并且他们的代码在资源文件夹中的 plist 文件中仍然可以正常工作。

提前感谢您的帮助。

【问题讨论】:

的问题。您不能写入 ios 应用程序的捆绑包 如果 plist 在应用程序包中,它在真实设备上是不可写的。快速测试是在模拟器上运行您的代码。如果保护是问题,我相信它会在模拟器上工作并在手机上失败。 谢谢 vadian 和 Phillip!只是另一个问题:那么我应该仅在应用程序第一次启动时将 plist 文件从捆绑包复制到文档目录并从那里访问它吗?还是有其他方法可以做到这一点?我想没有理由从一开始就在资源文件夹中包含一个 plist 文件,因为我可以在应用程序启动时在文档目录中创建一个新的 plist 文件并从那里开始。 【参考方案1】:

是的,您必须将文件从 NSBundle 复制到 NSDocumentUser,例如文件“NimrokhRavanshenasi.sqlite3”

NSFileManager* fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *writableDbtPath = [documentsDirectory stringByAppendingPathComponent:@"NimrokhRavanshenasi.sqlite3"];

BOOL success = [fileManager fileExistsAtPath:writableDbtPath];
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"NimrokhRavanshenasi.sqlite3"];
NSError *error;
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDbtPath error:&error];


NSFileManager *filemgr = [NSFileManager defaultManager];

sqlite3_stmt *compiledStatement;
if([filemgr fileExistsAtPath:writableDbtPath])
    if (sqlite3_open([writableDbtPath UTF8String], &_contactDB) != SQLITE_OK) 
        NSLog(@"Failed to open database!");

【讨论】:

谢谢阿夫辛和埃克塔!我只是好奇资源文件夹中是否需要 plist 文件,因为我可以在应用程序启动时在文档目录中创建一个新的 plist 文件,而不是从资源文件夹中复制 plist 文件。 File.sqlite3 示例,您可以将此代码用于 file.plist 并继续 首先在 NSBunlde 上创建一个 Plist 文件并使用此代码将文件从 NSBundle 复制到 NSDocumentUser

以上是关于编辑 plist 文件(目标 c)的主要内容,如果未能解决你的问题,请参考以下文章

plist 捆绑版本值

需要帮助阅读目标 c 中的 plist 文件

访问 Plist 数组/节点 - 目标 C [重复]

从 iphone SDK 3.3 及更高版本中的 plist 文件创建数组:目标 c

Visual Studio 2017 Info.plist 在选项卡更改后丢失分发目标

Xcode Buildtime 错误:'无法加载文件列表的内容:'.../Info.plist'(在目标'xxxx'中)