所以我现在一直在研究这个项目。我从DB读取数据并将其格式化为UITableViews没有问题。但是现在我也想写信给DB。问题是我不断从sqlite获得“数据库被锁定”错误。在弄乱了原始版本之后,我通过实现我的数据库在捆绑中因此无法写入。所以我将数据库重新定位到可写入的Apps Documents文件夹。但现在我仍然得到相同的“数据库被锁定”SQL错误。我只在必要时打开和关闭数据库。据我所知,我不会把它留在任何地方。下面是我想要更新的代码。有什么想法吗?
- (BOOL) loanBookTo:(NSString *)newborrower{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"books.sqlite"];
if([[NSFileManager defaultManager] fileExistsAtPath:path]){
NSLog(@"File Exists at: %@", path);
}
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
NSString *mySQL = @"UPDATE BOOKS SET LOANED = 1, BORROWER = \"<BORROWER>\" where ISBN = \"<ISBN>\"";
mySQL = [mySQL stringByReplacingOccurrencesOfString:@"<ISBN>" withString:self.isbn];
mySQL = [mySQL stringByReplacingOccurrencesOfString:@"<BORROWER>" withString:newborrower];
const char *sql = [mySQL UTF8String];
char* errmsg;
sqlite3_exec(database, sql, NULL, NULL, &errmsg);
// Q. Database is locked. Why?
// A. Because it is in the Bundle and is ReadOnly.
// Need to write a copy to the Doc folder.
// Database is Locked error gets spit out here.
printf(errmsg);
sqlite3_close(database);
}
return NO;
}
答案 0 :(得分:0)
在应用程序启动时打开数据库一次,然后在AppDelegate的applicationWillTerminate中关闭它。
在每个执行程序之后,您将需要执行重置以清除连接状态。
看看SQLiteBooks示例应用程序,它以这种方式编码。
答案 1 :(得分:0)
如何将数据库从捆绑包中移动到文档文件夹?您需要检查它是否存在,如果不复制它。我觉得你要么以其他方式复制它,但保留了只读属性,或者更可能的是,你仍然引用了捆绑中的原始属性。
详见
Where would you place your SQLite database file in an iPhone app?
或者正如joshperry所说,SQLiteBooks示例包含您需要的所有代码。
答案 2 :(得分:0)
你是如何获得贷款的?如果数据库是打开的,然后你调用loanBookTo,它可能不会抛出open的错误,但是数据库保持着你来的状态。
此外,有时,数据库会在关闭和退出应用程序时保留锁定状态,因此您可以继承&#39;您之前失败的锁定状态。从模拟器中删除应用程序应该会给你一个干净的副本。