如何在 Xcode 的 iOS 应用程序中包含读写(现有)SQLite 数据库?

How to include a read-write (existing) SQLite database in an iOS app from Xcode?

提问人:V_49 提问时间:11/19/2020 最后编辑:V_49 更新时间:11/24/2020 访问量:244

问:

我正在尝试在我的 iOS 应用程序中包含来自 Xcode 的预先创建的 sqlite 数据库。当应用从 Web 服务器收到某些通知(JSON 格式)时,需要更新数据库。

该数据库包含在 Xcode 文件中,我在检查器中看到了它。

我用于在数据库中插入数据的函数如下:

   Import SQLite
      

   func insertItem(item: Item){
            let id = Expression<Int64>("id")
            let description = Expression<String>("description")
            
            
            let bundle = Bundle.main
            let path = bundle.path(forResource: "DatabaseLocale", ofType: "sqlite")!
        
            let db = try! Connection("\(path)")
            
            let items = Table("Items")
            
            let insert = items.insert(id <- Int64(item.id), description <- item.description)
            
            do{
                let rowid = try! db.run(insert)
            } catch {
                print("cannot modify the database")
            }
            
            do{
                for itemID in try db.prepare(items){
                    print(itemID[id])
                    print(itemID[description])
                }
            } catch {
                print("couldn't connect to database")
            }
        }

现在,当我在模拟器中运行应用程序时,我得到了我想要的结果,因此应用程序接收的新数据被正确地写入数据库,但每当我使用我的物理 iPhone 时,我都会收到一个错误:

Fatal error: 'try!' expression unexpectedly raised an error: attempt to write a readonly database (code: 8)

如何使 iPhone 应用程序内的 SQLite 数据库可修改?

iOS的 swift iphone sqlite

评论

2赞 DonMag 11/19/2020
您无法修改捆绑包中的文件。您需要将 sqlite 文件从捆绑包复制到 Documents 文件夹,然后读/写该文件。顺便说一句,除非你选择SQLite,因为你已经非常熟悉它,否则你可能想看看CoreData。
0赞 Rob 11/19/2020
或者,应用程序支持目录可能更好,而不是文档文件夹。
0赞 V_49 12/23/2020
我尝试复制它,但它没有帮助,也许一个可能的解决方案是在应用程序第一次打开时创建数据库?在这种情况下,数据库是保留在内存中,还是在我重新打开应用程序时将其删除?

答: 暂无答案