【问题标题】:how to save image into sqlite3 using swift如何使用swift将图像保存到sqlite3
【发布时间】:2018-03-27 14:38:47
【问题描述】:

我想将图像存储到 sqlite3。我是 iOS 新手,请帮助我了解如何保存此图像并在图像视图中检索。

Appdelegate.swift

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.


        createDB()
        return true
    }



    func createDB()
    {
        // create db

        let dir = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

        let dbpath = dir.appendingPathComponent("imgdatabase.sqlite")

        print(dir)

        // check if file exist 

        let m = FileManager()

        if m.fileExists(atPath: dbpath.path)
        {

            print("file exist no need to create")
        }
        else
        {
            m.createFile(atPath: dbpath.path, contents: nil, attributes: nil)

        }

        // open db

        var op : OpaquePointer? = nil


        if sqlite3_open(dbpath.path, &op)==SQLITE_OK
        {

            print("db open successfuly")

            let query = "create table img_save(img text)"


            if sqlite3_exec(op, query.cString(using: .utf8), nil, nil, nil)==SQLITE_OK
            {
                print("table created ")

            }
            else
            {

                print("table  not created")
            }
        }
            else
            {
            print("db unable to open")

            }

        sqlite3_close(op)

        }

Image_save_ViewController.swift

import UIKit

class Image_save_ViewController: UIViewController {

    @IBAction func img_display_click(_ sender: AnyObject) {



           }

    @IBOutlet weak var imgview: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()



            }


    @IBAction func img_save_click(_ sender: AnyObject) {

        let image : UIImage = UIImage(named: "35-handgun-png-image.png")!
        let imageData : NSData = UIImagePNGRepresentation(image)! as NSData
        let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)


        var decodeimg : NSData = NSData(base64Encoded: strBase64, options: NSData.Base64DecodingOptions(rawValue: 0))!

        imgview.image = UIImage(data : decodeimg as Data)!


        let dir = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

        let dbpath = dir.appendingPathComponent("imgdatabase.sqlite")
        print(dir)
        // check if file exist

        let m = FileManager()

        if m.fileExists(atPath: dbpath.path)
        {

            print("file exist no need to create")

        }
        else
        {
            m.createFile(atPath: dbpath.path, contents: nil, attributes: nil)
            print("db file created")


        }

        // open db

        var op : OpaquePointer? = nil

        if sqlite3_open(dbpath.path, &op)==SQLITE_OK
        {
           print("db open successfuly")

            let image_d = strBase64

            let query = String.init(format : "insert into img_save values('%@')", image_d)

            if sqlite3_exec(op, query.cString(using: .utf8), nil, nil, nil)==SQLITE_OK
            {

                print("image saved successfuly")
            }
            else
            {

                print("unable to save")
            }
        }
        else
        {
            print("unable to open db")
        }

        sqlite3_close(op)
    }

我在这里添加 READDB() 函数,我正在从数据库中获取图像

@IBOutlet 弱变量 imgview: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    readDB()

    //imgview.image = UIImage(named: "35-handgun-png-image.png")
        }


func readDB()

{

    let image : UIImage = UIImage(named: "35-handgun-png-image.png")!
    let imageData = UIImagePNGRepresentation(image)!

    let docdir = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    print(docdir)
    let imgurl = docdir.appendingPathComponent("35-handgun-png-image.png")

    try! imageData.write(to: imgurl)

    let newImage = UIImage(contentsOfFile: imgurl.path)


    let dir = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

    let dbpath = dir.appendingPathComponent("imgdatabase.sqlite")

    //check file if exist

    let m = FileManager()

    if m.fileExists(atPath: dbpath.path)
    {

        print("file exist no need to create")
    }
    else
    {

        m.createFile(atPath: dbpath.path, contents: nil, attributes: nil)
        print("file created")
    }

    //open db

    var opq : OpaquePointer? = nil

    if sqlite3_open(dbpath.path, &opq)==SQLITE_OK
    {

        let query = "select * from img_save"


        var st : OpaquePointer? = nil

        if sqlite3_prepare(opq, query.cString(using: .utf8), -1, &st, nil)==SQLITE_OK
        {
            while sqlite3_step(st)==SQLITE_ROW
            {

                let imgd = String.init(format : "%s",sqlite3_column_text(st, 0))
                //let imgd = String.init(format : "%s",sqlite3_value_text(st!))

                imgview.image = UIImage(named : imgd)
                print("nil value")

            }

        }
    }

    sqlite3_close(opq)

}

早些时候它显示致命错误发现 NIL 会展开值,但现在我已经采取图像视图来存储列值并使用图像视图显示它..所以请告诉我如何实现这一点,我在那里得到 NIL 值

【问题讨论】:

  • 但是你在哪里看到这个错误?
  • 在 image_save_ 视图控制器中
  • 在哪里?告诉我们你的问题是什么,什么是 nil
  • @Lu 当我点击保存按钮时出现此错误,我无法解决此问题,请查看它修复它或举例说明...提前非常感谢您跨度>
  • 好的,现在我知道它在img_save_click 尝试告诉我更多,哪一行?

标签: ios swift


【解决方案1】:

如果可能,您可以按特定名称将图像写入应用程序文档目录。 并将该名称保存在 sqlite 表中。从 sqlite 中检索名称,从文档目录中检索图像。

【讨论】:

  • @Sanjeev 可以举例说明一下
  • 首先像这样在文档目录中写入图片 let documentsDirectoryURL = try! NSFileManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, properForURL: nil, create: true) // 创建一个名字 let fileURL = documentsDirectoryURL.URLByAppendingPathComponent("Image.jpg") if !NSFileManager.defaultManager().fileExistsAtPath( fileURL.path!) { if UIImageJPEGRepresentation(image, 1.0)!.writeToFile(fileURL.path!, atomically: true) { print("saved") } else { print("error") } } else { print("file已经存在") } 在sqlite表中保存这个名称“Image.jpg”后
  • 谢谢@Saneev先生
  • 还有一个问题@sanjeev 先生,在检索图像时我应该做什么,请帮助我
  • 我不明白你想说什么。只是一个例子:如果你有一个登录屏幕,并且你想在那里显示一个图像。按名称“login.jpg”下载文件目录中的图像存储,并将此名称下载到登录屏幕的表中,此图像名称为“login.jpg”。当出现登录屏幕时,请在表格中检查图像的名称,如果您正在获取名称,则检查图像是否存在。如果存在,则不显示下载。我试图更简短。如果有任何问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多