首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从sqlite文件SWIFT4.2加载数据

从sqlite文件SWIFT4.2加载数据
EN

Stack Overflow用户
提问于 2019-05-29 18:11:34
回答 3查看 882关注 0票数 0

我在sqlite中有大型数据库,所以我试图从我的data.sqlite文件中直接访问它,但是我无法访问它。我过去用目标C完成了那项任务

采取的步骤:

1:将data.sqlite文件拖到项目中

2:尝试通过fmdb访问它。

输出: /var/mobile/Containers/Data/Application/557B2961-52D8-4B14-BABC-BF4829852127/Documents/data.sqlite path===

代码语言:javascript
复制
let documentsDirectory = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString) as String 
pathToDatabase = documentsDirectory.appending("/(databaseFileName)")

func openDatabase() -> Bool {
 print("path=== \(pathToDatabase ?? "empty")")
      if database == nil {
           if FileManager.default.fileExists(atPath: pathToDatabase) {
                database = FMDatabase(path: pathToDatabase) 
//code is not entering in that if , it should be there becasuse I already included my sqlitefile    
 } 
        if database != nil {
            if database.open() {
                return true
            }
        }
        return false
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-29 18:39:51

我没有使用fmdb,但是我在最近的一个项目中成功地使用了GRDB (https://github.com/groue/GRDB.swift)。通常,当出现错误时,这些库将允许您检索错误代码或日志输出,这可能对解决问题非常有用。

同时,下面是一个Swift函数,用于将文件名转换为完整的文档用户路径:

代码语言:javascript
复制
    private static func path(for filename: String) -> String {
        let fm = FileManager.default
        let documentsDirectory = fm.urls(for: .documentDirectory, in: .userDomainMask).first
        return documentsDirectory?.appendingPathComponent(filename).absoluteString ?? filename
    }

但是,请注意,作为构建的一部分包含的文件通常不在您的文档中,而是包资源的一部分。在这种情况下,这段代码可能更有用:

代码语言:javascript
复制
    let path = Bundle.main.path(forResource: "mydatabase", ofType: "sqlite")
票数 0
EN

Stack Overflow用户

发布于 2019-05-29 18:40:07

如果本地数据库文件不存在,尝试将其复制到应用程序的文档库中。

代码语言:javascript
复制
import FMDB

class DBService {
    // MARK: Properties
    static let shared = DBService()
    var database: FMDatabase!

    private let fileManager = FileManager.default
    private var documentsDBPath: String
    private var resourcesDBPath: String

    private let databaseFileName = "data"
    private let databaseFileName = "sqlite"

    // MARK: Initializers
    private init() {
        documentsDBPath = try! fileManager
            .url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
            .appendingPathComponent(databaseFileName)
            .appendingPathExtension(databaseFileExtension)
            .path

        resourcesDBPath = Bundle.main.path(forResource: databaseFileName,
                                           ofType: databaseFileExtension)!
    }

    // MARK: - Setup
    func isDatabaseOpen() -> Bool {
        if database == nil {
            initDatabase()
        }

        return database.open()
    }

    private func initDatabase() {
        if isFirstLaunch() {
            copyDatabase(from: resourcesDBPath, to: documentsDBPath)  
        }

        database = FMDatabase(path: documentsDBPath)
    }

    private func isFirstLaunch() -> Bool {
        return !fileManager.fileExists(atPath: documentsDBPath)
    }

    private func copyDatabase(from source: String, to destination: String) {
        do {
            try fileManager.copyItem(atPath: source, toPath: destination)
        } catch {
            debugPrint(error)
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2019-05-29 18:53:15

您的文件显然不在文档目录中,您应该在主包中访问它。

代码语言:javascript
复制
let dbUrl = Bundle.main.url(forResource: "data", withExtension: "sqlite")

如果需要在documents目录中复制数据库,请使用以下命令

代码语言:javascript
复制
let fileManager = FileManager.default
let dbUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).last!.appendingPathComponent("data.sqlite")
if !fileManager.fileExists(atPath: dbUrl.path) {
    let url = Bundle.main.url(forResource: "data", withExtension: "sqlite")!
    try? fileManager.copyItem(at: url, to: dbUrl)
}

使用

代码语言:javascript
复制
let database = FMDatabase(url: dbUrl)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56366350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档