如何在SharkORM中使用填充的SQLite数据库

时间:2019-02-08 16:25:10

标签: ios swift database sqlite

我是一名Android开发人员,开始学习iOS开发。我仍在学习,因此请在这里期待一些基本问题。

这是我想要实现的目标:我有一个现有的SQLite数据库(kanadb.db),我想在我的iOS应用程序中使用它。我想使用ORM来处理此数据库(访问权限为只读),因此我将.db文件拖放到了项目文件夹中,并在AppDelegate.swift中进行了此操作:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    SharkORM.setDelegate(self)
    SharkORM.openDatabaseNamed("kanadb")

    // -- Test --

    // Try to load some data from the database
    let results: SRKResultSet = Info.query().fetch()
    print(results)

    // ----------

    return true
}

但是它不起作用。我注意到它在文件系统某处的文件夹中创建了一个新的kanadb.db。在Android中也进行了类似的操作,在启动时,我们需要查看数据库是否已存在于app文件夹中,如果不存在,则将数据库从分发包复制到app文件夹中。看来我必须在这里做类似的事情,但是我不知道怎么做,因为我还是iOS的新手。

任何人都可以给我一些提示/代码片段,以使我指向正确的方向吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我刚刚找到了解决方案,所以我将其发布在这里,它对某人有用。

因此,正如我期望的那样,我们必须将捆绑的数据库复制到应用程序的文档文件夹中。但是,数据库文件必须在目标中可用,因此我们必须在文件列表中(在XCode中)将其选中,然后选中目标成员身份

然后,在使用它之前将其复制到Document文件夹:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    let DB_NAME = "kanadb"
    let DB_EXTENSION = "db"
    do{
        let databasePath = Bundle.main.url(forResource: DB_NAME, withExtension: DB_EXTENSION)
        let documentsDirectory = try FileManager.default.url(for: FileManager.SearchPathDirectory.documentDirectory, in:FileManager.SearchPathDomainMask.userDomainMask, appropriateFor:nil, create:false)

        let destination = documentsDirectory.appendingPathComponent(DB_NAME + "." + DB_EXTENSION)
        _ = try FileManager.default.copyItem(at: databasePath!, to:destination)

    } catch {
        // TODO: Catch the errors more gracefuly
        print("Couldn't copy the database to the document folder")
    }

    // Override point for customization after application launch.
    SharkORM.setDelegate(self)
    SharkORM.openDatabaseNamed(DB_NAME)

    // -- Test --

    // Try to load some data from the database
    let results: SRKResultSet = Info.query().fetch()
    print(results)

    // ----------

    return true
}

就是这样!现在,最好检查一下应用程序的“文档”文件夹中是否已存在该数据库,以免每次启动应用程序时都这样做。