我需要打开一个sqlite文件并从该文件中读取数据以显示在表中。 到目前为止,我有一个触发NSOpenPanel()的按钮,并获取路径。之后我尝试打开文件但是我遇到了编码问题。
在我的AppDelegate.swift
代码中@IBAction func importFromKobo(sender: AnyObject) {
var openPanel = NSOpenPanel()
let fileDB = "kobodbtest.sqlite"
openPanel.allowsMultipleSelection = false
openPanel.canChooseDirectories = true
openPanel.canCreateDirectories = true
openPanel.canChooseFiles = false
openPanel.beginWithCompletionHandler { (result) -> Void in
if result == NSFileHandlingPanelOKButton {
//Do what you will
//If there's only one URL, surely 'openPanel.URL'
var deviceURL = openPanel.URL!
println("Path: \(deviceURL)")
println(self.resultDev.stringValue)
self.resultDev.stringValue += "\nPath: \(deviceURL)"
self.resultInput.stringValue += "\nPath: \(deviceURL)"
var fullFilePathURL = deviceURL.URLByAppendingPathComponent(fileDB)
self.resultInput.stringValue += "\nFull path file: \(fullFilePathURL)"
var fileOpenError:NSError?
if NSFileManager.defaultManager().fileExistsAtPath(deviceURL.path!) {
println("file OK")
if let fileContent = String(contentsOfURL: fullFilePathURL, encoding: NSUTF8StringEncoding, error: &fileOpenError) {
println(fileContent) // prints ReadMe.txt contents if successful
} else {
if let fileOpenError = fileOpenError {
println(fileOpenError) // Error Domain=NSCocoaErrorDomain Code=XXX "The file “ReadMe.txt” couldn’t be opened because...."
}
}
} else {
println("file not found")
}
}
if result == NSFileHandlingPanelCancelButton {
self.resultDev.stringValue = "Cancel"
}
}
}`
控制台中的错误:
Path: file:///Users/alvaroruiz/Documents/xcode/
Result
file OK
Error Domain=NSCocoaErrorDomain Code=261 "The file “kobodbtest.sqlite” couldn’t be opened using text encoding Unicode (UTF-8)." UserInfo=0x60000026cb00 {NSFilePath=/Users/alvaroruiz/Documents/xcode/kobodbtest.sqlite, NSStringEncoding=4}
我已检查过sqlite> PRAGMA encoding;
格式为UTF-8。
使用其他编码(如NSISOLatin1StringEncoding)检查并获取文本但带有大量符号。
你能指点我怎么做查询命令吗?并在表格中显示?
感谢。 阿尔瓦罗
答案 0 :(得分:0)
您正在检查您刚刚选择的路径是否存在,这是不必要的。我想你想要检查最终文件:
if NSFileManager.defaultManager().fileExistsAtPath(fullFilePathURL.path!)
接下来,莱昂纳多的评论是正确的,你可以使用NSUTF16StringEncoding
来阅读该文件:
if let fileContent = String(contentsOfURL: fullFilePathURL, encoding: NSUTF16StringEncoding, error: &fileOpenError) {
但是sqlite数据库不是一个文本文件,只是将普通内容作为文本阅读并不会让你走得太远。 :)所以你应该使用专用工具来处理它,比如SQLite.swift。这将允许您运行查询并在表格中显示结果。