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<UnsafeMutablePointer<Int8>?>? = 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

搞了两个小时 不知道如何把 <UInt8> 转为<Int8> 在Swift 2.0 的时候可以直接转,不过Swift 3.0 不可以了
图一.png

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容