【问题标题】:Core Data Transformable to UIImage using sqllite3使用 sqlite3 可将核心数据转换为 UIImage
【发布时间】: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 文件中的现有内容复制到使用可编码协议管理的新模型

标签: swift sqlite core-data


【解决方案1】:

这没有意义,用CoreData把这个数据拿出来。

如果您从 CoreData 实体中删除类名,那么您可以删除您的托管对象子类。您仍然可以将对象作为原始 NSManagedObjects 访问。

【讨论】:

  • 那么,如果删除 CoreData 旧的 .sql 文件会被删除?
  • 不,它仍然存在,直到您运行代码来清理和删除它 - 在您迁移之后
【解决方案2】:

从我的角度来看,我试图实现的目标是有意义的。旧项目使用 CoreData,除其他外,表“Album”使用 NSManagedObject 类“Album”。因此,如果按照要求,我需要更改旧模型以实现 Codable 协议,则不能使用“Album”类。

为了能够使用旧类名的类,我必须删除所有 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 的那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    相关资源
    最近更新 更多