Базовые данные, преобразуемые в UIImage с использованием sqllite3 - PullRequest
0 голосов
/ 29 января 2019

Я снова работаю над старым приложением, которое использует Core Data, и я намерен по разным причинам перейти на Codable.

Пока что я получил .sqlite из папки приложения и экспортировал его в свой компьютер, чтобы я мог видеть структуру.Таблица, к которой относится этот вопрос, такова:

enter image description here

Для извлечения содержимого я использую класс Helper, который считывает файл .sqlite из приложения.папка.До сих пор мне удалось извлечь всю информацию, но когда я пытаюсь получить UIImage из 'ZPICTURE', который является преобразовываемым значением UIImage, хранящимся как NSData, я получаю исключение 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 голосов
/ 05 февраля 2019

С моей точки зрения, то, что я пытался достичь, имело смысл.В старом проекте использовались CoreData, и, в частности, в таблице «Альбом» использовался класс NSManagedObject «Альбом».Так что, если, как и требовалось, мне нужно было изменить старую модель для реализации протокола Codable, класс «Album» использовать нельзя.

Чтобы иметь возможность использовать класс со старым именем класса, мне пришлось удалить все зависимости CoreData и скопировать содержимое, которое было сохранено в файле sql, в новый класс Codable.

ТамЕсть разные способы получить данные из файла SQL.Я мог бы выбрать «SQL.swift», но вместо этого я использовал «sqlite3».

Итак, способ получить UIImage с использованием sqlite3 из файла sql, который содержит базу данных CoreData и значение было сохраненоТип атрибута Transformable является следующим:

... 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 - это тот, который обрабатывает UIImage из данных BLOB-объектов.

0 голосов
/ 30 января 2019

Это не имеет смысла, используйте CoreData для получения этих данных.

Если вы удалите имя класса из сущностей CoreData, то сможете удалить подклассы управляемого объекта.Вы по-прежнему можете обращаться к объектам как к необработанным NSManagedObjects.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...