我已经创建了SQLite DB文件,并在模拟器中的App中将其填充了数据,现在我需要相同的数据库并在新项目中填充数据。 我已将SQLite文件复制到新项目,但是每次更新一行(删除/编辑)时,数据都会更新,直到下一次运行为止。重新运行该项目后,我的数据和SQLite文件就像是已被新复制到项目中一样。
P.S。:“ clearData(_ SID:Int)”函数删除一行,但是在xcode中重新运行该项目后,该行就在那里...
这是我的数据库结构:
import SQLite
var db: Connection!
let sherTable = Table("Sher");
let ID = Expression<Int>("SID");
let Fname = Expression<String?>("Fname");
let Ename = Expression<String?>("Ename");
let Flike = Expression<Bool?>("Flike");
let Elike = Expression<Bool?>("Elike");
let byteTable = Table("Byte");
let BID = Expression<Int>("BID");
let BSID = Expression<Int>("SID");
let Byte = Expression<String?>("Byte");
let searchText = Expression<String?>("searchText");
let BIsFarsi = Expression<Bool?>("IsFarsi");
let maniTable = Table("Mani");
let MID = Expression<Int>("MID");
let MSID = Expression<Int>("SID");
let Word = Expression<String?>("Word");
let Meaning = Expression<String?>("Meaning");
let MIsFarsi = Expression<Bool?>("IsFarsi");
func connectToDB() {
do {
let path = Bundle.main.path(forResource: "hafezDb", ofType: "sqlite3")!;
let tmp = try Connection(path);
db = tmp;
} catch {
print(error);
}
}
func clearData(_ SID: Int) {
let sher = sherTable.filter(ID == SID);
let u = sher.update(Flike <- !Flike);
do {
try db.run(u);
} catch {
print(error)
}
}
答案 0 :(得分:1)
您必须在模拟器中运行。
应用程序的捆绑包在真实设备上是只读的,但在模拟器中可写。
因此,您的应用似乎可以在模拟器中运行。但是然后您进行另一次构建,则每次运行项目时,项目中的预填充数据库文件都会放回到已构建的应用程序中,然后再次从原始数据重新开始。
在真实设备上,您的应用将失败,并出现有关数据库为只读的错误。
应用程序启动时需要做的是将只读数据库文件从应用程序捆绑包复制到应用程序沙箱的可写部分,例如Documents文件夹。当然,您首先要检查“文档”文件夹中是否存在该文件,仅在文件不存在的情况下才将其复制。