代码之家  ›  专栏  ›  技术社区  ›  Adi

在Objective-C(iPhone)中将字符串保存到文件中

  •  3
  • Adi  · 技术社区  · 15 年前

    我似乎遇到了一个从字符串中保存XML文件的问题(这是在iPhone上完成的) 文件本身存在并包含在项目中(因此在工作区中),我从下面的代码片段中得到的所有指示在模拟器上无任何错误地通过,在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

    1 回复  |  直到 9 年前
        1
  •  19
  •   Will Harris    15 年前

    不应写入应用程序包中包含的文件。在真正的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];