最近工作上 要写一个阿里云推送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 不可以了
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!)
如果对你那个有帮助,记得分享一下。