FMDB& Swift,“可选(”没有这样的表:学生信息“)”在真实设备中,但它可以在模拟器中完成

时间:2017-03-13 18:57:54

标签: swift3 xcode8 fmdb

我是新手,请帮我解决这个问题,我还有很多其他工作要做,非常感谢你非常感谢!

How to use FMDB on the generic iOS device instead of simulator?之后的另一个问题 当我在我的设备上执行应用程序并且错误抛出时:“没有这样的表:学生信息”,我打印了所有路径并且它们都指向同一个文件,所以我假设数据库已经复制了?控制台显示如下:

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位于目标中的捆绑资源中;我设备中的内容为空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)
        }
    }
} 

2 个答案:

答案 0 :(得分:0)

首先尝试删除您的应用,然后重新安装。

OR

我在Swift中创建了一个基于FMDB的项目,您可以用它来解决您的问题。您也可以在Objective C项目中使用FMDB Wrapper类。

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

希望这有帮助。

答案 1 :(得分:0)

好的回答这个问题我已经完成了你的演示。

我发现了几个错误。让我逐一介绍。

  

1)您的类Utility有一个getPath方法。它会做什么   尽管db已存在于文档中,但每次都会继续复制db   目录和您的文档目录db将替换为示例结构。您应该始终检查db是否已存在于文档目录中。

     

2)您的数据库被复制到文档目录但结构中   未获得#39;吨。 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
}

更改了这段代码后,我试图在我的设备中运行并插入几条记录。

如果您还有其他问题,请与我们联系。

如果您觉得这个答案有帮助,请接受它。