实现FMDatabase的问题

时间:2016-07-26 05:50:08

标签: swift sqlite

我对iOs开发很新,我正在尝试关注this tutorial

一切似乎都正常工作但是当我创建ModelManager类时,代码无法构建并出现以下错误

class ModelManager{
    let sharedInstance = ModelManager()
    class func getInstance() -> ModelManager
    {
        if(sharedInstance.database == nil) //Instance member 'sharedInstance' cannot be used on type 'ModelManager'
        {
            sharedInstance.database = FMDatabase(path: Utility.getPath("FirstAscent.sqlite")) ///Use of unresolved identifier 'FMDatabase'
        }
        return sharedInstance //Instance member 'sharedInstance' cannot be used on type 'ModelManager'
    }

}

在本教程的前面,我也找不到libsqlite3.0.dylib文件将其作为二进制文件链接到我的库,但我已经链接了.tbd文件。

我还按照指示将fmdb复制到项目中的文件夹中。

任何建议都将不胜感激

1 个答案:

答案 0 :(得分:2)

  1. 问题是sharedInstance应该在班级中定义为static,例如:

    static let sharedInstance = ModelManager()
    

    然后,只要您需要引用此单例,就可以引用ModelManager.sharedInstance(而不仅仅是sharedInstance)。

    查看此代码示例,我认为作者希望您将此sharedInstance实现为全局,但我认为这是一个糟糕的决定。最好将它设为ModelManager的类属性,以避免污染您的命名空间。

    虽然我们正在谈论设计选择,但本教程使用getInstance方法是一个糟糕的设计选择。首先,它不是线程安全的。其次,它也打破了单例模式(即你必须引用这个方法,而不是sharedInstance属性......他的代码示例使用两者,这真的很糟糕)。我建议完全从代码中删除getInstance,并将FMDatabase实例的初始化合并到init方法ModelManager中。然后,您可以在需要访问此单例的任何位置引用ModelManager.sharedInstance,并消除线程安全问题以及对getInstance的依赖。

  2. 关于.dylib vs .tbd文件,没问题。 Xcode用于提供dylib个文件,但许多文件已被这些tbd文件替换。请参阅https://stackoverflow.com/a/32115656/1271826

  3. 如果您仍然看到"使用未解析的标识符' FMDatabase'"错误,请确保

    • 您已将FMDB *.m文件包含在您的目标中(您可以通过转到"编译源""构建阶段"标签下的部分确认目标设置);和

    • 确保在您的桥接头文件中包含#import "FMDB.h"