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") " 在真实设备中,但可以在模拟器中完成的主要内容,如果未能解决你的问题,请参考以下文章
FMDB、Swift 3、executeUpdate - 编译器构建失败
如何在 Swift 中使用“FMDB/SQLCipher”进行加密和解密?