FMDB и Swift, необязательно (такой таблицы нет: информация о студенте) на реальном устройстве, но это можно сделать в симуляторе

Я новичок, пожалуйста, помогите мне решить эту проблему, у меня еще есть много других вещей, над которыми нужно поработать, действительно, спасибо большое!

Это еще один вопрос после Как использовать FMDB на обычном устройстве iOS вместо симулятора? Когда я запускаю приложение на своем устройстве и выдает ошибку: «нет такой таблицы: информация о студенте», я распечатал весь путь, и все они указывали на тот же файл, поэтому я предположил, что база данных уже скопирована? Консоль выглядит так:

file:///var/mobile/Containers/Data/Application/B5E42F3C-524E-4BBF-8667-1EED0C963A77/Documents/
file:///var/mobile/Containers/Data/Application/B5E42F3C-524E-4BBF-8667-1EED0C963A77/Documents/Data.db
/var/mobile/Containers/Data/Application/B5E42F3C-524E-4BBF-8667-1EED0C963A77/Documents/Data.db
file:///var/mobile/Containers/Data/Application/B5E42F3C-524E-4BBF-8667-1EED0C963A77/Documents/
file:///var/mobile/Containers/Data/Application/B5E42F3C-524E-4BBF-8667-1EED0C963A77/Documents/Data.db
/var/mobile/Containers/Data/Application/B5E42F3C-524E-4BBF-8667-1EED0C963A77/Documents/Data.db
/var/mobile/Containers/Data/Application/B5E42F3C-524E-4BBF-8667-1EED0C963A77/Documents/Data.db
<NSFileManager: 0x17401c1b0>
2017-03-13 16:43:25.446039 Test1.3[16360:5045427] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2017-03-13 16:43:25.457278 Test1.3[16360:5045427] [MC] Reading from public effective user settings.
Insert failed:
Optional("no such table: Student info")

Data.db находится в моих ресурсах пакета в target; а содержимое моего устройства пустое Data.db;

Второй вопрос: если вы посмотрите на Utility.Swift в предыдущем вопросе, хотя приложение хорошо работает на симуляторе, но после его загрузки должно появиться сообщение alertView «Ваша копия базы данных успешно», но этого не произошло. Ниже приводится эта часть кода:

    class func copyFile(_ fileName: NSString){

    let dbPath: String = getPath(fileName as String)
    let fileManager = FileManager.default

    print(dbPath)
    print(fileManager)

    if !fileManager.fileExists(atPath: dbPath) {
        let documentsURL = Bundle.main.resourceURL
        let fromPath = documentsURL!.appendingPathComponent(fileName as String)

        var error : NSError?
        do {
            try fileManager.copyItem(atPath: fromPath.path, toPath: dbPath)
        }
        catch let error1 as NSError {
            error = error1
        }
        if(error != nil){
            self.invokeAlertMethod("Error Occured", strBody: "\(error?.localizedDescription)" as NSString, delegate: nil)
        }
        else{
            self.invokeAlertMethod("Successed", strBody: "Your database copy successfully", delegate: nil)
        }
    }
} 

person Grace Yang    schedule 13.03.2017    source источник
comment
Можете ли вы попробовать переустановить приложение еще раз ?. Просто удалите приложение с устройства и переустановите.   -  person Anil Kukadeja    schedule 14.03.2017
comment
да, я пробовал это, но не сработало   -  person Grace Yang    schedule 14.03.2017
comment
Вы можете поделиться со мной своим исходным кодом ..? Я хотел бы разобраться в коде.   -  person Anil Kukadeja    schedule 15.03.2017
comment
да конечно, как я могу это сделать?   -  person Grace Yang    schedule 16.03.2017
comment
Просто загрузите его в Dropbox и поделитесь ссылкой.   -  person Anil Kukadeja    schedule 16.03.2017
comment
Ах да, спасибо вам огромное !!!! Вот ссылка: dropbox.com/sh/zn2gijylqsfsAgl=ru&hl=ru / а>   -  person Grace Yang    schedule 17.03.2017


Ответы (2)


Хорошо, чтобы ответить на этот вопрос, я просмотрел вашу демонстрацию.

Где я нашел пару ошибок. Позвольте мне пройти по одному.

1) У вашей утилиты класса есть метод getPath. Что он делает, он будет копировать db каждый раз, хотя db уже присутствует в каталоге документов, и ваш каталог документов db будет заменен структурой образца. Вы всегда должны проверять, присутствует ли база данных в каталоге документов или нет.

2) Ваш БД копировался в каталог документов, а структура - нет. В db каталога документов не было таблицы с информацией о студентах.

3) Пожалуйста, избегайте использования пробелов или каких-либо специальных символов в именах таблиц.

Я просто исправил ваш метод getPath в служебном классе.

Пожалуйста, замените свой метод этим

class func getPath(_ fileName: String) -> String {

         let bundlePath = Bundle.main.path(forResource: "Data", ofType: ".db")
         let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
         let fileManager = FileManager.default
         let fullDestPath = URL(fileURLWithPath: destPath).appendingPathComponent("Data.db")
         if fileManager.fileExists(atPath: fullDestPath.path){
            print("Database file is exist")
            print(fileManager.fileExists(atPath: bundlePath!))
         }else{
            do{
                try fileManager.copyItem(atPath: bundlePath!, toPath: fullDestPath.path)
            }catch{
                print("\n",error)
            }
         }

        print(fullDestPath.path)
        return fullDestPath.path
}

После изменения этого фрагмента кода я попытался запустить его на своем устройстве и вставил пару записей.

Позвольте мне знать, если у вас есть какие-либо другие вопросы.

Если вы найдете этот ответ полезным, просто примите его.

person Anil Kukadeja    schedule 17.03.2017
comment
Большое тебе спасибо!!!! Это очень понятно !! и я пробовал метод, который вы написали, есть ошибка в try, он сказал, что не может преобразовать 'String' в 'URL', это тоже происходит с вашим Xcode? - person Grace Yang; 17.03.2017
comment
@GraceYang: в моем Xcode нет ошибок. Этот код находится в быстром 3. - person Anil Kukadeja; 20.03.2017
comment
Пропустил что-то XD, думаю, будет хорошо, и я попробую сразу после того, как вернусь из библиотеки !!! Спасибо!!! - person Grace Yang; 20.03.2017

Сначала попробуйте удалить приложение, а затем переустановить его.

OR

Я создал проект над FMDB в Swift, который вы можете использовать для решения своей проблемы. FMDB Wrapper, который вы также можете использовать в проекте Objective C.

https://github.com/LalitKY/Swift-FMDB

Надеюсь это поможет.

person Lalit    schedule 14.03.2017
comment
Спасибо, но я попытался удалить приложение и переустановить его снова, ничего не вышло. - person Grace Yang; 14.03.2017
comment
Затем перейдите к проекту, которым я поделился. - person Lalit; 15.03.2017