swift - 实现 FMDatabase 时遇到的问题

标签 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. 问题在于 sharedInstance 应该在类中定义为 static,例如:

    static let sharedInstance = ModelManager()
    

    然后,每当您需要引用此单例时,您都可以引用 ModelManager.sharedInstance (不仅仅是 sharedInstance)。

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

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

  2. 关于 .dylib.tbd 文件,这很好。 Xcode 曾经提供 dylib 文件,但许多文件已被这些 tbd 文件替换。请参阅https://stackoverflow.com/a/32115656/1271826 .

  3. 如果您仍然看到“使用无法解析的标识符‘FMDatabase’”错误,请确保

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

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

关于swift - 实现 FMDatabase 时遇到的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38581917/

相关文章:

ios - 如何在 sprite kit swift 中以编程方式在横向中添加 iAd 横幅

java - 从应用程序小部件访问 Phonegap 创建的数据库

swift - 我可以使用 swift 使 self.entity 成为组件中某些功能的非可选吗?

swift - 使用 Swift 将图像上传到服务器时出错

javascript - 为什么我的 JSON 文件包含 [object Object]?

SQLite 选择计数 10 小时前的记录

java - android 上的 noob SQLite 光标错误

Android: Sqlite Exception 没有这样的表?

ios - 创建一个每 24 小时运行一次的事件?

ios - 快速解析JSON数组