【发布时间】:2019-06-22 13:40:50
【问题描述】:
我正在重新开发一个使用 Core Data 的旧应用程序,出于不同的原因,我的意图是迁移到 Codable。
到目前为止,我已经从 app 应用程序文件夹中获取了 .sqlite 并将其导出到我的计算机中,这样我就可以看到结构了。这个问题所指的表格就是那个。
为了提取内容,我使用了一个从应用程序文件夹中读取 .sqlite 文件的 Helper 类。到目前为止,我已经设法提取了所有信息,但是当我尝试从“ZPICTURE”获取 UIImage 时,这是一个存储为 NSData 的可转换值 UIImage,我得到一个 nil 异常,但数据不是 nil。
我附上了处理所有 .sqlite 数据提取的部分函数。
func startConvertion(){
var albumArray:[AlbumC] = [AlbumC]()
var db: OpaquePointer?
//Open DB
if sqlite3_open(dbFileURL.path, &db) == SQLITE_OK {
print("\(logClassName) DB Openned successfuly")
//Get Albums
var albumQueryPointer:OpaquePointer?
let albumQueryString = "SELECT * FROM ZALBUM"
if sqlite3_prepare(db, albumQueryString, -1, &albumQueryPointer, nil) == SQLITE_OK{
while(sqlite3_step(albumQueryPointer) == SQLITE_ROW){
let pkAlbum = sqlite3_column_int(albumQueryPointer, 0)
let albumName = String(cString: sqlite3_column_text(albumQueryPointer, 4))
let albumArtist = String(cString: sqlite3_column_text(albumQueryPointer, 3))
print("\(logClassName) Getting Album for \(pkAlbum) - \(albumArtist) - \(albumName)")
let album = AlbumC(title: albumName, albumArtist: albumArtist)
//Get Image Blob of data
if let dataBlob = sqlite3_column_blob(albumQueryPointer, 5){
let dataBlobLength = sqlite3_column_bytes(albumQueryPointer, 5)
let blobNSData = NSData(bytes: dataBlob, length: Int(dataBlobLength))
//CRASH
let testImage = UIImage(data: blobNSData as Data)!
//album.artworkData = NSData(bytes: dataBlob, length: Int(dataBlobLength)) as Data
}
}
}
}
}
【问题讨论】:
-
为什么要直接访问 SQLite 文件?为什么不使用 CoreData API 来获取数据?
-
因为,如果可能的话,我正在考虑为下一个版本删除所有核心数据遗留问题,并且该助手“静默”地将存储在 .sqllite 文件中的现有内容复制到使用可编码协议管理的新模型