iPhone sqlite3锁定,只能读取,不能写入

时间:2009-10-31 07:31:37

标签: iphone database sqlite locked

所以我现在一直在研究这个项目。我从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;
    }

3 个答案:

答案 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;您之前失败的锁定状态。从模拟器中删除应用程序应该会给你一个干净的副本。