将字符串保存到Objective-C(iPhone)中的文件中
我似乎遇到了一个关于从字符串保存xml文件的问题(这是在iPhone上完成的) 文件本身存在并包含在项目中(因此在工作区中),我从代码片段中得到的所有指示在emulator上没有任何错误,在iPhone上没有任何错误(错误513),但在任何情况下都不会保存文件将字符串保存到Objective-C(iPhone)中的文件中,objective-c,iphone,save,Objective C,Iphone,Save,我似乎遇到了一个关于从字符串保存xml文件的问题(这是在iPhone上完成的) 文件本身存在并包含在项目中(因此在工作区中),我从代码片段中得到的所有指示在emulator上没有任何错误,在iPhone上没有任何错误(错误513),但在任何情况下都不会保存文件 { Hits = config->Hits; NSString* filenameStr = [m_FileName stringByAppendingFormat: @".xml" ]; NSString* pData
{
Hits = config->Hits;
NSString* filenameStr = [m_FileName stringByAppendingFormat: @".xml" ];
NSString* pData = [self getDataString]; // write xml format - checked out ok
NSError *error;
/* option 2 - does not work as well
NSBundle *mainBundle = [NSBundle mainBundle];
NSURL *xmlURL = [NSURL fileURLWithPath:[mainBundle pathForResource: m_FileName ofType: @"xml"]];
if(![pData writeToURL: xmlURL atomically: true encoding:NSUTF8StringEncoding error:&error])
{
NSLog(@"Houston - we have a problem %s@\n",[error localizedFailureReason]);
return false;
}
*/
if(![pData writeToFile: filenameStr atomically: FALSE encoding:NSUTF8StringEncoding error:&error])
{
NSLog(@"Houston - we have a problem %s@\n",[error localizedFailureReason]);
return false;
}
return true;
}
任何帮助都将不胜感激,
-A您不应写入应用程序包中包含的文件。在真正的iPhone上,您可能无法执行此操作,因为这些文件都经过数字签名 即使您可以修改打包文件,它也不是存储数据的好地方。从应用商店升级或Xcode生成重新安装应用程序将用原始文件覆盖该文件 而是将XML存储到Documents目录中。您可以获得如下路径:
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
NSString* leafname = [m_FileName stringByAppendingFormat: @".xml" ];
NSString* filenameStr = [documentsDirectory
stringByAppendingPathComponent:leafname];
如果您的文件需要一些您不想在代码中生成的初始状态,请让您的应用程序在第一次需要它时检查它是否存在于文档目录中,如果缺少,请从包中的模板复制它
存储结构化数据的另一种方法是使用用户默认值。例如:
[[NSUserDefaults standardUserDefaults] setObject:foo forKey:FOO_KEY];
你能给出解释513错误的字符串吗?另外,请注意:在打印localizedFailureReason时,最好在NSLog语句中使用%@而不是%s。%@格式说明符接受一个NSString*,而%s需要一个以null结尾的char*字符串。从技术上讲,%@接受任何NSObject类型,并调用[object description],该字符串本身就是[object description];但它也适用于其他NSObject类型(例如数组、集合等)+1用于用户默认方法。但是,该文件并不能防止覆盖,因为它是数字签名的,而是只读的,不能被覆盖。它们也有数字签名,但这并不是阻止写入的原因。