可使用sqllite3

时间:2019-01-29 12:16:17

标签: swift sqlite core-data

我再次在使用Core Data的旧应用程序上工作,出于不同的原因,我打算迁移到Codable。

到目前为止,我已经从应用程序应用程序文件夹中获取.sqlite并将其导出到我的计算机中,以便可以看到结构。这个问题所指向的表就是那个。

enter image description here

要提取内容,我正在使用一个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
                }
            }

        }

    }

}

2 个答案:

答案 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的对象。