从另一个视图控制器打开和使用数据库

Opening and using a database from another view controller

我在一个视图控制器中创建了一个数据库,我想打开它并在另一个视图控制器中访问它。我想知道如何从另一个视图控制器中的一个视图控制器打开现有数据库。我打算打开数据库并能够更新一行,所以我还需要访问“部分”(例如 ID、姓名、电子邮件)。你可以帮帮我吗?任何事情都会有所帮助。谢谢!

您可以从任何 VC 访问您的数据库。代码(你可能会在任何你想从中访问你的数据库的地方使用)就像

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

do {
                let db = try Connection("\(path)/<your.db.filename>")

                let recordsTable = Table("records")
                //or whatever you'd like to do, extract, modify, insert or delete

    } 
catch let error {
            print("Data operation failed for records table: \(error)")
        }

无需在整个项目中复制相同的代码,您可以为任何数据库操作单独创建自己的 class 并从任何地方访问它:

    class DatabaseOps {
    //..
    func getHighscoreTable() -> Array<HighScoreDataArray> {
                
            let path = NSSearchPathForDirectoriesInDomains(
                .documentDirectory, .userDomainMask, true
            ).first!
            
            var highscores = [HighScoreDataArray]()
                
                do {
                    let db = try Connection("\(path)/tasksolver.db")
    
                    let score = Expression<Int>("Score")
                    let username = Expression<String>("Username")
                    let recordsTable = Table("records").order(score.desc).limit(10)
                    
                        for row in try db.prepare(recordsTable) {
                   
                            let highscore = HighScoreDataArray(score: Int(row[score]), username: String(row[username]))
                            highscores += [highscore]
                        }
                    
                    }     catch let error {
                    print("Data operation failed for records table: \(error)")
                }
    return highscores
        }

//..
}

    class RecordsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var myDb : DatabaseOps = DatabaseOps()
    //...
    super.viewDidLoad()
    //get the data from database by using myDB method
    myHighScoreTable = myDb.getHighscoreTable()

此外,在您尝试不同的 VC 之前 - 不要忘记确保您的数据库文件就位。如果不是,let db = try Connection 将为您创建一个空数据库,其中将不包含您要访问的任何数据或表。