IOS.xcode копирует нулевую байтовую базу данных sqlite при запуске в каталоге документов / - PullRequest
0 голосов
/ 04 декабря 2018

РЕДАКТИРОВАТЬ:

По просьбе Мэдди я включаю код, который "открывает" файл:

Я удалил приложение и снова запустил его через Xcode.До этого в каталоге документов не было файлов, поэтому я проверил и, поскольку файлов не было, я мог скопировать 32-байтовый файл sqlite со своими таблицами в нем из основного комплекта.

Проблема в том, что теперь, после того как я удалил его, он создает действительный файл sqlite с нулевым байтом в папке каталога без таблиц, когда он запускается, если в каталоге документов нет файла.Так что в приложении appdelegate, когда я проверяю файл, он правильно говорит, что есть, хотя это не тот файл, который мне нужен.Если я вручную захожу в iTunes на устройстве и удаляю файл, он копирует нужный файл.

Это происходит как в симуляторе, так и в устройстве.Есть идеи, что я могу делать не так.Ниже приведен фрагмент кода от делегата приложения: Xcode 10.1 и синтаксис swift 4.2:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    Fabric.with([Crashlytics.self])

    let sourcePath = Bundle.main.path(forResource: "mydb", ofType: "db")!
    let fileManager = FileManager.default
    let doumentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
    let destinationPath = doumentDirectoryPath.appendingPathComponent("mydb")
    if !fileManager.fileExists(atPath: destinationPath) {
        do {
            try fileManager.copyItem(atPath: sourcePath, toPath: destinationPath)
        }
        catch
        {
            os_log("error copying database")
            Crashlytics.sharedInstance().recordError(error)
            print(error)
        }

    }

    return true
}

код, открывающий файл

import Foundation
import SQLite
import os.log

 var connected: Bool
//MARK: - private attributes
var db: Connection?

//MARK: - constructor
init() {
    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
    do {
        db = try Connection("\(path)/mydb.db")
        connected = true
    }
    catch {
        connected = false
    }
}

Заранее большое спасибо.Это действительно озадачивает меня.

1 Ответ

0 голосов
/ 05 декабря 2018

Я использую Sqlite.swift и вот конструктор для метода Connection:

/// Initializes a new SQLite connection.
///
/// - Parameters:
///
///   - location: The location of the database. Creates a new database if it
///     doesn’t already exist (unless in read-only mode).
///
///     Default: `.inMemory`.
///
///   - readonly: Whether or not to open the database in a read-only state.
///
///     Default: `false`.
///
/// - Returns: A new database connection.
public init(_ location: SQLite.Connection.Location = default, readonly: Bool = default) throws

Таким образом, он создает базу данных (пустую без таблиц), если она не существует.Поэтому я изменил код в отредактированном вопросе так:

//MARK: - constructor
init() {
    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
    do {
        let sourcePath = Bundle.main.path(forResource: "mydb", ofType: "db")!
        let fileManager = FileManager.default
        let doumentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
        let destinationPath = doumentDirectoryPath.appendingPathComponent("mydb.db")
        if !fileManager.fileExists(atPath: destinationPath) {
            try fileManager.copyItem(atPath: sourcePath, toPath: destinationPath)
        }

        db = try Connection("\(path)/mydb.db")
        connected = true
    }
    catch {
        connected = false
    }
}

, и это работает.Большое спасибо за подсказки.

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