Swift 实现FML数据库的问题
我对iOs开发还很陌生,我正在努力跟上 一切似乎都正常工作,但当我创建ModelManager类时,代码无法生成,出现以下错误Swift 实现FML数据库的问题,swift,sqlite,Swift,Sqlite,我对iOs开发还很陌生,我正在努力跟上 一切似乎都正常工作,但当我创建ModelManager类时,代码无法生成,出现以下错误 class ModelManager{ let sharedInstance = ModelManager() class func getInstance() -> ModelManager { if(sharedInstance.database == nil) //Instance member 'sharedInst
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
文件所取代。看- 您将FMDB
文件包括到目标中(您可以通过进入目标设置下“构建阶段”选项卡的“编译源代码”部分来确认);及*.m
- 确保在桥接头文件中包含
#import“FMDB.h”
谢谢你的回答。我现在在FMDB中试图导入XCTest/XCTest.h的文件出现问题。我得到一个错误,无法找到该文件。我试着在网上寻找解决方案,但似乎找不到解决方法。您通常只在单元测试中使用
xtest
。你在做单元测试吗?如果相关代码未用于单元测试,则不应导入XCTest
。我想知道,当您将FMDB添加到项目中时,您是否意外地复制了太多不相关的文件(例如,FMDB本身在其自己的项目中使用的单元测试)。确保在应用程序中只包含src/fmdb
文件夹的内容。该代码是我复制到项目中的fmdb项目的一部分。我没有运行任何测试。是的,所以你可能复制了一些你不想复制的东西。应添加到项目中的唯一文件是文件夹中的.m
和.h
文件(但不是info.plist
…您的项目已具有info.plist
)。只需删除意外添加到项目中的所有测试(以及意外包含的任何其他测试),您就应该很好了。是的,我复制了项目,而不是文件夹。现在一切正常。我仍然很可能会抓挠一切,以使其线程安全,但我学到了很多,谢谢:)