Swift 实现FML数据库的问题

Swift 实现FML数据库的问题,swift,sqlite,Swift,Sqlite,我对iOs开发还很陌生,我正在努力跟上 一切似乎都正常工作,但当我创建ModelManager类时,代码无法生成,出现以下错误 class ModelManager{ let sharedInstance = ModelManager() class func getInstance() -> ModelManager { if(sharedInstance.database == nil) //Instance member 'sharedInst

我对iOs开发还很陌生,我正在努力跟上

一切似乎都正常工作,但当我创建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复制到项目中的文件夹中

如有任何建议,将不胜感激

  • 问题在于
    sharedInstance
    应定义为类内的
    静态
    ,例如:

    static let sharedInstance = ModelManager()
    
    然后,您可以在需要引用此单例时引用
    ModelManager.sharedInstance
    (不仅仅是
    sharedInstance

    看看这个代码示例,我认为作者打算让您将这个
    sharedInstance
    作为一个全局应用程序来实现,但我认为这是一个糟糕的决定。最好将其作为
    ModelManager
    的类属性,以避免污染命名空间

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

  • 关于
    .dylib
    vs
    .tbd
    文件,这很好。Xcode用于提供
    dylib
    文件,但许多文件已被这些
    tbd
    文件所取代。看

  • 如果仍然看到“使用未解析标识符'FMDatabase'”错误,请确保

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

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


  • 谢谢你的回答。我现在在FMDB中试图导入XCTest/XCTest.h的文件出现问题。我得到一个错误,无法找到该文件。我试着在网上寻找解决方案,但似乎找不到解决方法。您通常只在单元测试中使用
    xtest
    。你在做单元测试吗?如果相关代码未用于单元测试,则不应导入
    XCTest
    。我想知道,当您将FMDB添加到项目中时,您是否意外地复制了太多不相关的文件(例如,FMDB本身在其自己的项目中使用的单元测试)。确保在应用程序中只包含
    src/fmdb
    文件夹的内容。该代码是我复制到项目中的fmdb项目的一部分。我没有运行任何测试。是的,所以你可能复制了一些你不想复制的东西。应添加到项目中的唯一文件是文件夹中的
    .m
    .h
    文件(但不是
    info.plist
    …您的项目已具有
    info.plist
    )。只需删除意外添加到项目中的所有测试(以及意外包含的任何其他测试),您就应该很好了。是的,我复制了项目,而不是文件夹。现在一切正常。我仍然很可能会抓挠一切,以使其线程安全,但我学到了很多,谢谢:)