我应该将sqlite数据库文件写入Documents目录或Library / Caches吗?

时间:2012-08-07 06:19:55

标签: iphone ios5 xcode4.2 data-storage

我已经阅读了Apple的数据存储指南,我真的很困惑,我应该保留我在我的应用程序中创建的sqlite数据库文件。即使应用程序处于Offfline模式,我也想从sqlite文件中读取。我读到创建的这些文件应保存在Library / caches中,并设置“不备份”标志。请建议我采用相同的方法。

2 个答案:

答案 0 :(得分:5)

答案取决于数据库文件的创建方式:

According to the Data Storage Guidelines page

  
      
  1. 只应存储用户生成的文档和其他数据,或者应用程序无法重新创建的数据。   / Documents目录,将自动进行   由iCloud支持。

  2.   
  3. 可以重新下载或重新生成的数据应存储在/ Library / Caches目录中。文件示例   你应该在Caches目录中包含数据库缓存文件   和可下载的内容,例如杂志,报纸,   和地图应用程序。

  4.   

这对我来说似乎相对清楚:如果您的应用程序以编程方式创建某些内容或生成您想要保存的数据,请将其放在“Caches”文件夹中。如果它是客户自己生成的独特东西(通过键入键盘或他们手动干预和做过的事情),请将其放入“文档”中。

“不备份”意味着文件永远不会被发送到iCloud,如果它们丢失,则必须从头开始重新创建(或重新安装)。

答案 1 :(得分:1)

这可能会对你有所帮助。将数据库复制到文档目录就足够了,bundle上的文件是只读的,在某些情况下如果需要随时更新,最好先复制数据库,如果文件目录中不存在的话。

将数据库复制到文档目录的示例代码如下:

-(void) checkAndCreateDatabase {

    // Setup some globals
    NSString *databaseName = @"AnimalDatabase.sql";

    // Get the path to the documents directory and append the databaseName
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName];


    // Check if the SQL database has already been saved to the users phone, if not then copy it over
    BOOL success;

    // Create a FileManager object, we will use this to check the status
    // of the database and to copy it over if required
    NSFileManager *fileManager = [NSFileManager defaultManager];

    // Check if the database has already been created in the users filesystem
    success = [fileManager fileExistsAtPath:databasePath];

    // If the database already exists then return without doing anything
    if(success) return;

    // If not then proceed to copy the database from the application to the users filesystem

    // Get the path to the database in the application package
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

    // Copy the database from the package to the users filesystem
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

    [fileManager release];
}

您可以参考此Tutorial 文件目录中的文件,内容是读取,写入模式,因此您可以从数据库中读取内容。