我再次在使用Core Data的旧应用程序上工作,出于不同的原因,我打算迁移到Codable。
到目前为止,我已经从应用程序应用程序文件夹中获取.sqlite并将其导出到我的计算机中,以便可以看到结构。这个问题所指向的表就是那个。
要提取内容,我正在使用一个Helper类,该类从应用程序应用程序文件夹中读取.sqlite文件。到目前为止,我已经设法提取了所有信息,但是当我尝试从“ 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
}
}
}
}
}
答案 0 :(得分:0)
这没有道理,请使用CoreData提取此数据。
如果从CoreData实体中删除类名,则可以删除托管对象子类。您仍然可以将对象作为原始NSManagedObjects进行访问。
答案 1 :(得分:0)
从我的角度来看,我试图实现的目标是有道理的。旧项目使用CoreData,表“ Album”除其他外使用NSManagedObject类“ Album”。因此,如果根据要求,我需要更改旧模型以实现Codable协议,则无法使用“相册”类。
为了能够使用具有旧类名称的类,我必须删除所有CoreData依赖项,并将存储在sql文件中的内容复制到新的Codable类。
有多种方法可以从sql文件中获取数据。我本可以选择“ SQL.swift”,但是我改用了“ sqlite3”。
因此,使用sqlite3从包含CoreData数据库且值已存储在Transformable属性类型中的sql文件中获取UIImage的方法如下:
... FROM Question
//Get Image Blob of data
if let dataBlob = sqlite3_column_blob(albumQueryPointer, 5){
let dataBlobLength = Int(sqlite3_column_bytes(albumQueryPointer, 5))
if let aImage:UIImage = UIImage(data:NSKeyedUnarchiver.unarchiveObject(with:Data(bytes:dataBlob, count:dataBlobLength)) as! Data){
album.artwork = aImage
}
}
...FROM Question
NSKeyedUnarchiver是处理blob数据中的UIImage的对象。