与 SQLite.swift 中的数据库建立读写连接

Establishing a Read-Write connection to a database in SQLite.swift

我正在开展一个项目,我需要使用 SQLite 数据库来读取、创建和编辑不同的对象。我以为我已经正确建立了连接,但事实证明我只是建立了一个只读连接。如何使用 SQLite.swift

将此代码修改为读写连接
import Foundation
import SQLite
import UIKit


let path = Bundle.main.path(forResource: "Assignment2", ofType: "sqlite3")
//Array of customer structs to populate the table
var customerArray: [Customer] = []


class CustomerPageVC: UIViewController, UITableViewDelegate, UITableViewDataSource {

//IBOutlets
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var addCustButton: UIButton!



override func viewDidLoad() {
    super.viewDidLoad()
    //Additional Setup
    do {
        //Search for DB in documents directory
        let db = try Connection(path!)
        let customers = Table("Customers")
        //Define the columns of the table as expressions
        let id = Expression<Int64>("CustomerID")
        let name = Expression<String>("CustomerName")
        let contactName = Expression<String>("ContactName")
        let address = Expression<String>("Address")
        let city = Expression<String>("City")
        let postalCode = Expression<String>("PostalCode")
        let country = Expression<String>("Country")
        
        //Load the data from db file into customerArray
        for customer in try db.prepare(customers) {
            let cust = Customer(Int(customer[id]), customer[name], customer[contactName], customer[address], customer[city], customer[postalCode], customer[country])
            customerArray.append(cust)
        }
    }
    catch {
        print(error)
    }
    tableView.delegate = self
    tableView.dataSource = self
} 
}

编辑 文档中有一个 func copyDatabaseIfNeeded 所以也许我真正的问题是我在什么情况下使用这个 func 将数据库复制到应用程序支持目录?

func copyDatabaseIfNeeded(sourcePath: String) -> Bool {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let destinationPath = documents + "/db.sqlite3"
let exists = FileManager.default.fileExists(atPath: destinationPath)
guard !exists else { return false }
do {
    try FileManager.default.copyItem(atPath: sourcePath, toPath: destinationPath)
    return true
} catch {
  print("error during file copy: \(error)")
    return false
}
}

您可以在此处找到 SQLite.swift 的文档 https://github.com/stephencelis/SQLite.swift/blob/master/Documentation/Index.md#connecting-to-a-database

当数据库在您的文档目录中创建后,它将永久存在,直到用户删除应用程序或您删除该目录。
因此,当您将 sql 文件保存在此目录中时,将发生读写连接。
如您所愿,我为您创建了一个我最近创建的新示例。

import UIKit
import SQLite

class ViewController: UIViewController {
    
    let customer = Table("Customer")
    let id = Expression<Int64>("CustomerID")
    let name = Expression<String>("CustomerName")
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let db = makeDBConnection()
        createTable(db: db)
        insertNewCustomer(db: db)
        fetchDatabase(db: db)
    }
    
    private func makeDBConnection() -> Connection {
        let path = NSSearchPathForDirectoriesInDomains(
            .documentDirectory, .userDomainMask, true
        ).first!
        
        let sourcePath = "\(path)/db.sqlite3"
        
        _ = copyDatabaseIfNeeded(sourcePath: sourcePath)

        return try! Connection(sourcePath)
    }
    
    private func createTable(db: Connection) {
        //Define the columns of the table as expressions
        
        do {
            try db.run(customer.create(block: { table in
                table.column(id, primaryKey: true)
                table.column(name)
            }))
        } catch {
            // This tells you table already created for second time you running this code
        }
    }
    
    private func insertNewCustomer(db: Connection) {
        // This will insert a new customer into your table each time app runs
        let insert = customer.insert(name <- "Reza")
        try! db.run(insert)
    }
    
    private func fetchDatabase(db: Connection) {
        for customer in try! db.prepare(customer) {
            print("id: \(customer[id]), name: \(customer[name])")
        }
    }
    
    func copyDatabaseIfNeeded(sourcePath: String) -> Bool {
        let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        let destinationPath = documents + "/db.sqlite3"
        let exists = FileManager.default.fileExists(atPath: destinationPath)
        guard !exists else { return false }
        do {
            try FileManager.default.copyItem(atPath: sourcePath, toPath: destinationPath)
            return true
        } catch {
          print("error during file copy: \(error)")
            return false
        }
    }
}

结果是我每次运行应用程序时: