5

我已经阅读了 Apple 的数据存储指南,并且对于我应该将我在我的应用程序中创建的 sqlite 数据库文件保存在哪里感到非常困惑。即使应用程序处于离线模式,我也想从 sqlite 文件中读取。我读到,创建的此类文件应保存在库/缓存中,并设置“不备份”标志。请建议我做同样的正确方法。

4

2 回答 2

5

答案取决于您的数据库文件是如何创建的:

根据数据存储指南页面

  1. 只有用户生成的或应用程序无法重新创建的文档和其他数据,才应存储在 /Documents 目录中,并由 iCloud 自动备份。

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

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

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

于 2012-08-07T06:30:59.237 回答
1

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

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

-(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];
}

可以参考本教程 文档目录下的文件,内容是读写模式,所以可以从数据库中读取内容。

于 2012-08-07T06:46:56.697 回答