【问题标题】:Saving a string into file in Objective-C (iPhone)在Objective-C(iPhone)中将字符串保存到文件中
【发布时间】:2010-11-20 00:07:35
【问题描述】:

我似乎偶然发现了一个关于从字符串中保存 xml 文件的问题(这是在 iPhone 上完成的) 该文件本身存在并包含在项目中(因此在工作区中),并且我从后面的代码 sn-p 获得的所有指示在模拟器上没有任何错误并在 iPhone 上失败(错误 513),但在任何一种情况下文件未保存!

{
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

【问题讨论】:

  • 你能给出解释什么是错误 513 的字符串吗?另外,请注意:在打印本地化失败原因时,最好在 NSLog 语句中使用 %@ 而不是 %s。 %@ 格式说明符接受一个 NSString*,而 %s 需要一个以 null 结尾的 char* 字符串。
  • 从技术上讲, %@ 采用任何 NSObject 类型,并调用 [object description] 在字符串的情况下是它本身;但它也适用于其他 NSObject 类型(例如数组、集合等)

标签: objective-c iphone save


【解决方案1】:

您不应写入应用程序包中包含的文件。在真正的 iPhone 上,您可能无法执行此操作,因为这些文件经过数字签名。

即使你可以修改一个打包的文件,它也不是一个存储数据的好地方。从 App Store 升级或 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];

【讨论】:

  • +1 用于用户默认方法。但是,该文件不会阻止覆盖,因为它是数字签名的,而是它是只读的并且不能被覆盖。它们也经过数字签名,但这并不是阻止它被写入的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多