Swift_3.0_实战篇(1)_数据库中遇到的问题

最近工作上 要写一个阿里云推送GitHub 的SwiftDemo
之前没Swift 停留在 1.0 的 基础上,写起来也是有点吃力
下面说说我遇到的问题吧

 // 初始化数据库
    public func init_datebase() {
        // 查找数据文件位置和目标位置
        let database_path: String = NSHomeDirectory() + "/Documents/ued.sqlite"
        // 存储数据文件位置,方便后期使用
        db_path = database_path as NSString?
        // 如果数据文件不存在,则拷贝工程目录下的ued.sqlite 到指定位置
        if !FileManager.default.fileExists(atPath: database_path) {
            let preloadURL = Bundle.main.path(forResource: "ued", ofType: "sqlite")
            do {
                try FileManager.default.copyItem(atPath:preloadURL!, toPath: database_path)
            } catch let error as NSError {
                print(error)//如果创建失败,error 会返回错误信息
            }
        }
    }

上面的代码中我遇到两个问题
一、 之前没用过 do {
我看了一下别人的 大多数是 try! FileManager.default.......
之前的代码就一句:运行报错

try! FileManager.default.copyItem(atPath:preloadURL!, toPath: database_path)

之后才改为:

 do {
     try FileManager.default.copyItem(atPath:preloadURL!, toPath: database_path)
            } catch let error as NSError {
                print(error)//如果创建失败,error 会返回错误信息
      }

二、报错创建文件失败
也就是 print(error)
之前是

let database_path: String = NSHomeDirectory() + "/ued.sqlite"

后来改为

let database_path: String = NSHomeDirectory() + "/Documents/ued.sqlite"

之后是创建数据库

遇见的问题
三、以前OC 是 直接打印错误是 &err 现在Swift3.0 是

            let errmsg : UnsafeMutablePointer?>? = nil
            if sqlite3_exec(db, sql.utf8String, nil, nil, errmsg) != SQLITE_OK {
                sqlite3_close(db)
                print("SQL执行失败~" + String(describing: errmsg))
            } else {
                print("SQL执行成功~")
            }

创建一个全局 db
public var db: OpaquePointer? = nil
以及 statement
var statement: OpaquePointer? = nil

搞了两个小时 不知道如何把 转为 在Swift 2.0 的时候可以直接转,不过Swift 3.0 不可以了
Swift_3.0_实战篇(1)_数据库中遇到的问题_第1张图片
图一.png

Swift3.0 指针转换 当处理 C 的 API 的时候,有时候需要将指向结构体的指针转换为不同的结构体。对于 C 的 API 的处理很简单(同时也是十分危险并且容易出现报错)的,就像你在 Swift3.0 中所看到的,所有指针的类型是被固定的,而 UnsafePointer 的指针不能再用在需要 UnsafePointer 的地方,这使得能够更好的编写出更加安全的代码,但是同样意味着你不能在你需要的时候随意转换指针类型

我遇到的问题是
// OC 是这样的
// tempEntity.messageContent = [[NSString alloc]initWithUTF8String:(char*)sqlite3_column_text(statement, 1)];
//改为 Swift 3.0 如下

 var pr:  UnsafePointer = sqlite3_column_text(statement, 1)!           
 var prr: UnsafePointer? {
                        return withUnsafePointer(to: &pr) {
                            $0.withMemoryRebound(to: UnsafePointer.self, capacity: 1) {
                            $0.pointee
                            }
                        }
                    }            
 tempEntity.messageContent = NSString.init(utf8String: prr!)

如果对你那个有帮助,记得分享一下。

你可能感兴趣的:(Swift_3.0_实战篇(1)_数据库中遇到的问题)