FMDB & Swift, " Optional("no such table: Student info") " 在真实设备中,但可以在模拟器中完成

Posted

技术标签:

【中文标题】FMDB & Swift, " Optional("no such table: Student info") " 在真实设备中,但可以在模拟器中完成【英文标题】:FMDB & Swift, " Optional("no such table: Student info") " in real device but it can be done in simulator 【发布时间】:2017-03-13 18:57:54 【问题描述】:

我是新手,请帮我解决这个问题,我还有很多其他事情要做,真的非常感谢非常感谢!

这是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)
        
    
 

【问题讨论】:

您可以尝试重新安装该应用程序吗?只需从设备中删除应用并重新安装即可。 是的,我试过了,但没用 你能和我分享你的源代码吗?我想弄清楚一段代码。 当然可以,我该怎么做? 只需将其上传到保管箱并分享链接。 【参考方案1】:

好的,回答这个问题,我浏览了你的演示。

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

1) 你的类 Utility 有一个 getPath 方法。它会做什么 尽管 db 已经存在于文档中,但每次都继续复制 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

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

如果您还有其他问题,请告诉我。

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

【讨论】:

非常感谢!!!!非常清楚!!我试过你写的方法,try有一个错误,它说不能将'String'转换为'URL',你的Xcode也会出现这种情况吗? @GraceYang:我的 Xcode 没有错误。此代码在 swift 3 中。 遗漏了一些东西XD,我觉得会很好,我会在我从图书馆回来后立即尝试!!!谢谢!!!【参考方案2】:

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

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

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

希望这会有所帮助。

【讨论】:

谢谢您,但我已尝试删除该应用并重新安装,但没有成功 然后继续我分享的项目。

以上是关于FMDB & Swift, " Optional("no such table: Student info") " 在真实设备中,但可以在模拟器中完成的主要内容,如果未能解决你的问题,请参考以下文章

使用 swift + FMDB 插入 NULL

FMDB、Swift 3、executeUpdate - 编译器构建失败

如何在 Swift 中使用“FMDB/SQLCipher”进行加密和解密?

使用 Swift + FMDB 打开和关闭数据库

如何将 FMDB 与 cocoapods 和 swift 一起使用?

如何在 swift 3 中使用现有的 SQLite? (FMDB)