iphone - 您会将 SQLite 数据库文件放在 iPhone 应用程序的什么位置?

标签 iphone sqlite

当我最初为我的应用程序创建一个带有预插入数据集的 SQLite 数据库文件时,我必须将该文件放在我的 Xcode 项目中的某个位置,以便它转到我的 iPhone 应用程序。我想“资源”是正确的地方。

在 iPhone 应用程序中部署 SQLite 数据库文件的基本“步骤”是什么?

  • 手动创建数据库
  • 将数据库文件添加到项目(在哪里?)

我目前正在阅读整个 SQLite 文档,尽管它与 iPhone 的关系不大。

最佳答案

您需要先将 SQLite 文件添加到您的 Xcode 项目中 - 最合适的位置是在资源文件夹中。

然后在您的应用程序委托(delegate)代码文件中,在 appDidFinishLaunching 方法中,您需要首先检查是否已经创建了 SQLite 文件的可写副本 - 即:已在用户文档中创建了 SQLite 文件的副本iPhone 文件系统上的文件夹。如果是,你什么都不做(否则你会用默认的 Xcode SQLite 副本覆盖它)

如果不是,那么您将 SQLite 文件复制到那里 - 使其可写。

请参阅下面的代码示例来执行此操作:这取自 Apple 的 SQLite 书籍代码示例,其中从应用程序委托(delegate) appDidFinishLaunching 方法调用此方法。

// Creates a writable copy of the bundled default database in the application Documents directory.
- (void)createEditableCopyOfDatabaseIfNeeded {
    // First, test for existence.
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bookdb.sql"];
    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success)
        return;
    // The writable database does not exist, so copy the default to the appropriate location.
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"bookdb.sql"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}

============

这是 Swift 2.0+ 中的上述代码

// Creates a writable copy of the bundled default database in the application Documents directory.
private func createEditableCopyOfDatabaseIfNeeded() -> Void
{
    // First, test for existence.
    let fileManager: NSFileManager = NSFileManager.defaultManager();
    let paths:NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let documentsDirectory:NSString = paths.objectAtIndex(0) as! NSString;
    let writableDBPath:String = documentsDirectory.stringByAppendingPathComponent("bookdb.sql");

    if (fileManager.fileExistsAtPath(writableDBPath) == true)
    {
        return
    }
    else // The writable database does not exist, so copy the default to the appropriate location.
    {
        let defaultDBPath = NSBundle.mainBundle().pathForResource("bookdb", ofType: "sql")!

        do
        {
            try fileManager.copyItemAtPath(defaultDBPath, toPath: writableDBPath)
        }
        catch let unknownError
        {
            print("Failed to create writable database file with unknown error: \(unknownError)")
        }
    }
}

关于iphone - 您会将 SQLite 数据库文件放在 iPhone 应用程序的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/717108/

相关文章:

SQLite3 中的 PHP JSON 数组

python - 为什么 SQLite 中的多列索引会降低查询的性能,除非索引所有列?

iPhone 4 配备 BLE,使用核心蓝牙 4.0

iphone - Xcode 4 停止提供堆栈跟踪,发生了什么?

iphone - cocoa touch 的日历控件

iphone - UIView 动画在 View 消失时停止,在重新出现时不会恢复

c# - 在 C# 中使用 SEE SQlite 加密扩展

iphone - Xcode 从 rss feed 获取图像 url

sql - node-sqlite3序列化失败: SQLITE_CONSTRAINT: foreign key constraint failed

android - 按查询分组在 android 2.1 中不起作用