Где найти базу данных Sqlite в проекте Xcode - PullRequest
0 голосов
/ 31 октября 2018

Извините за повторение вопроса, хотя и немного по-другому, но я попробовал все, искал этот форум и Google, но не могу решить эту проблему. У меня есть база данных Sqlite (размером всего 20 КБ), которую я хочу использовать в проекте Swift 4 с использованием Xcode. Я поместил базу данных (файл .db) в папку, где Xcode сохранил мой проект, но когда я запускаю приложение, я получаю сообщение об ошибке «нет такой таблицы». Следуя пути к файлу на экране отладки, я перехожу к файлу размером 0 КБ, т. Е. Пустому. Я думал, что решил эту проблему, используя путь (например, FileManager.default.fileExists (atPath: "/ Users / ..."), но он не будет работать на моем iPhone (только в симуляторе), поэтому я ушел Вернемся к попытке использовать подход URL. Я скопировал основной фрагмент кода, но я подозреваю, что что-то не так с первыми несколькими строками, или я не подал файл .db в нужном месте. добавил его в инспектор проекта, он связан с проектом в качестве цели и отображается под битом ресурса комплекта копирования экрана этапов сборки. Я действительно изо всех сил здесь, поэтому любая помощь действительно ценится.

//Function to open Cities database, add cities to array, sort alphabetically and then append "Please select city" at the start of the array
func populatePickerView() {
    let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let databaseURL = fileURL.appendingPathComponent("Wanderer.db")
    let database = FMDatabase(path: databaseURL.absoluteString)

    guard database.open() else {
        print("Unable to open database")
        return
    }

    do {
        let cities:FMResultSet = try database.executeQuery("SELECT City from Cities", values: nil)

        while cities.next() {
            if let result = cities.string(forColumn: "City") {
                cityData.append(result)
            }
        }
    } catch {
        print("OOPS, some sort of failure")
    }

    cityData = cityData.sorted(by: <)
    cityData.insert("Please select city", at: 0)
}

1 Ответ

0 голосов
/ 31 октября 2018

Если вы перетащите свою базу данных в структуру вашего проекта XCode с «копированием элементов, если это необходимо» и ваша цель выбрана, ваша база данных будет расположена здесь:

let databaseInMainBundleURL = Bundle.main.resourceURL?.appendingPathComponent("Wanderer.db")

Если вы просто хотите прочитать данные, это будет хорошо, потому что основной пакет только для чтения.

Если вы хотите что-то сохранить в своей базе данных, вам нужно скопировать базу данных в каталог документов.

Вы можете использовать эту функцию, чтобы проверить, существует ли ваша база данных в каталоге документов, и скопировать, если необходимо.

func copyDatabaseIfNeeded(_ database: String) {

    let fileManager = FileManager.default

    let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)

    guard documentsUrl.count != 0 else {
        return
    }

    let finalDatabaseURL = documentsUrl.first!.appendingPathComponent("\(database).db")

    if !( (try? finalDatabaseURL.checkResourceIsReachable()) ?? false) {
        print("DB does not exist in documents folder")

        let databaseInMainBundleURL = Bundle.main.resourceURL?.appendingPathComponent("\(database).db")

        do {
            try fileManager.copyItem(atPath: (databaseInMainBundleURL?.path)!, toPath: finalDatabaseURL.path)
        } catch let error as NSError {
            print("Couldn't copy file to final location! Error:\(error.description)")
        }

    } else {
        print("Database file found at path: \(finalDatabaseURL.path)")
    }
}

и использовать с:

copyDatabaseIfNeeded("Wanderer")

После этого вы сможете использовать функцию populatePickerView.

...