簡體   English   中英

如何在Swift3中將數據從字符串插入Sqlite?

[英]how to insert data from string to Sqlite in Swift3?

我有一個問題,我嘗試將字符串數據插入Sqlite。 我想做的是在我的Details ViewController中,如果用戶按下Like按鈕,則字符串的字詞和含義會傳遞到在Favorite ViewController中顯示的Sqlite文件中。 以下是我的DetailsVC代碼。

    import UIKit
import AVFoundation

class DetailsVC: UIViewController, UITextViewDelegate {

    @IBOutlet weak var wordLbl: UILabel!
    @IBOutlet weak var meaningLbl: UITextView!
    @IBOutlet weak var sysWordLbl: UILabel!
    @IBOutlet weak var sysWordsLbl: UILabel!
    @IBOutlet weak var anyWordsLbl: UILabel!
    @IBOutlet weak var anyWordLbl: UILabel!
    @IBOutlet weak var wordImg: UIImageView!
    @IBOutlet weak var buSound: UIButton!
    @IBOutlet weak var buLike: UIButton!
    @IBOutlet weak var menuBtn: UIButton!

    //Data from HomeVC
    var data:Data?
    var fdatas = [FData]()
    var favouriteVC = FavouriteVC()

    override func viewDidLoad() {
        super.viewDidLoad()

        meaningLbl.delegate = self

        wordLbl.text = "\((data?._word.capitalized)!) \((data?._phonetic)!)"
        self.meaningLbl.text = data?._meaning
        self.sysWordsLbl.text = data?._meaning
        self.anyWordsLbl.text = data?._meaning
        self.sysWordLbl.text = "Synonym"
        self.anyWordLbl.text = "Antonym"
        meaningLbl.font = UIFont(name: FONT_REGULAR, size: 24.0)

    }

    @IBAction func buMenu(_ sender: Any) {
        //menu
       dismiss(animated: true, completion: nil)

    }

    @IBAction func buSound(_ sender: Any) {
        //Todo: speak the word
        if buSound.isEnabled == true{
            buSound.setImage(UIImage(named: "volume-2.png"), for: .normal)
        }else{
            buSound.setImage(UIImage(named: "volume-un-2.png"), for: .normal)
        }
        let utTerance = AVSpeechUtterance(string: "\((data?._word)!)")
        let synthesize = AVSpeechSynthesizer()
        utTerance.voice = AVSpeechSynthesisVoice(language: "en-gb")
        synthesize.speak(utTerance)
    }

    @IBAction func buLike(_ sender: Any) {
        //Todo: Click Like
        if buLike.isEnabled == true{
            buLike.setImage(UIImage(named: "heart.png"), for: .normal)
            //Save data to Database
            let word = data?._word ?? ""
            let meaning = data?._meaning ?? ""
            do{
                let favData = FData(word: word, meaning: meaning)
                self.fdatas.append(favData)
                print("\(word), \(meaning)")
            }catch{
                print(error)
            }
        }else{
            buSound.setImage(UIImage(named: "heart-un.png"), for: .normal)
        }
        //FavouriteVC.insertRowsAtIndexPaths([NSIndexPath(forRow: fdatas.count-1, inSection: 0)], withRowAnimation: .Fade)
    }

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

            self.view.endEditing(true);
            return false;

    }

}

我的最愛

    import UIKit
import SwipeCellKit
import SQLite

class FavouriteVC: UIViewController,UITableViewDelegate,UITableViewDataSource, SwipeTableViewCellDelegate{

    //TabelView
     @IBOutlet weak var fTableView: UITableView!

    //Variables
    var fdata = [FData]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // FtableView
        fTableView.delegate = self
        fTableView.dataSource = self

        //reload Data
        fTableView.reloadData()

    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return fdata.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: FAVOURITE_CELL, for: indexPath) as? FavouriteCell{
            cell.configureCell(fdata: fdata[indexPath.row])
            //cell.delegate = self
            return cell
        }
        return FavouriteCell()
    }

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? {
        guard orientation == .right else { return nil }

        let deleteAction = SwipeAction(style: .destructive, title: "Delete") { action, indexPath in
            // handle action by updating model with deletion

        }

        // customize the action appearance
        deleteAction.image = UIImage(named: "delete")

        return [deleteAction]
    }

}

FData.swif

    import Foundation

class FData {

    //let id: Int64?
    var word: String
    var meaning: String
    //var address: String

    init(id: Int64) {
       // self.id = id
        word = ""
        meaning = ""
        //address = ""
    }

    init(word: String, meaning: String) {
       // self.id = id
        self.word = word
        self.meaning = meaning
        //self.address = address
    }

}

FavouriteData實例

    import UIKit
import SQLite

class FavouriteData{

    static let instance = FavouriteData()
    private let db: Connection?

    private let words = Table("words")
    private let id = Expression<Int64>("id")
    private let wordL = Expression<String?>("word")
    private let meaningL = Expression<String?>("shanword_uni")
    //private let address = Expression<String>("address")

    private init() {
        let path = NSSearchPathForDirectoriesInDomains(
            .documentDirectory, .userDomainMask, true
            ).first!

        do {
            db = try Connection("\(path)/favourite.sqlite")
        } catch {
            db = nil
            print ("Unable to open database")
        }

        createTable()
    }

    func createTable() {
        do {
            try db!.run(words.create(ifNotExists: true) { table in
                table.column(id, primaryKey: true)
                table.column(wordL)
                //table.column(phone, unique: true)
                table.column(meaningL)
            })
        } catch {
            print("Unable to create table")
        }
    }

    func addData(word: String, meaning: String) -> Int64? {
        do {
            let insert = words.insert(wordL <- word, meaningL <- meaning)
            let id = try db!.run(insert)
            print("Save: \(id)")
            return id
        } catch {
            print("Insert failed")
            return -1
        }
    }

    func getData() -> [FData] {
        var contacts = [FData]()

        do {
            for contact in try db!.prepare(self.words) {
                contacts.append(FData(
                   // id: contact[id],
                    word: contact[wordL]!,
                    meaning: contact[meaningL]!))
            }
        } catch {
            print("Select failed")
        }

        return contacts
    }

    func deleteData(index: Int64) -> Bool {
        do {
            let contact = words.filter(id == index)
            try db!.run(contact.delete())
            return true
        } catch {
            print("Delete failed")
        }
        return false
    }

}

但是,FavouriteVC中沒有行單元。 如何解決這個問題? 請幫我。 最好,西貢法

我通過添加一行代碼解決了我的問題。 在我的FavouriteVC類中,只需將其添加到ViewdidLoad函數“ fdata = FavouriteData.instance.getData()”下。 這是我完整的代碼。

    import UIKit
    import SwipeCellKit
    import SQLite

    class FavouriteVC: UIViewController,UITableViewDelegate,UITableViewDataSource, SwipeTableViewCellDelegate{

        //TabelView
         @IBOutlet weak var fTableView: UITableView!

        //Variables
        var fdata = [FData]()

        override func viewDidLoad() {
            super.viewDidLoad()

            // FtableView
            fTableView.delegate = self
            fTableView.dataSource = self

            //reload Data
            fTableView.reloadData()
            //Get Data 
            fdata = FavouriteData.instance.getData()

        }

        func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }

        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return fdata.count
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            if let cell = tableView.dequeueReusableCell(withIdentifier: FAVOURITE_CELL, for: indexPath) as? FavouriteCell{
                cell.configureCell(fdata: fdata[indexPath.row])
                //cell.delegate = self
                return cell
            }
            return FavouriteCell()
        }

        func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? {
            guard orientation == .right else { return nil }

            let deleteAction = SwipeAction(style: .destructive, title: "Delete") { action, indexPath in
                // handle action by updating model with deletion

            }

            // customize the action appearance
            deleteAction.image = UIImage(named: "delete")

            return [deleteAction]
        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM