我是一名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的新手。
任何人都可以给我一些提示/代码片段,以使我指向正确的方向吗?
谢谢!
答案 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
}
就是这样!现在,最好检查一下应用程序的“文档”文件夹中是否已存在该数据库,以免每次启动应用程序时都这样做。