0

ですから、私はこのプロジェクトに少しの間取り組んできました。DBからデータを読み取り、それをUITableViewsにフォーマットすることに問題はありません。しかし、今はDBにも書き込みたいと思っています。問題は、sqliteから「データベースがロックされています」というエラーが発生し続けることです。元のバージョンをいじった後、データベースがバンドルに含まれているため、書き込み可能ではないことに気づき、顔をしかめる瞬間がありました。そこで、DBを書き込み可能なAppsDocumentsフォルダーに移動しました。しかし、今でも同じ「データベースがロックされています」というSQLエラーが発生します。必要な場合にのみDBを開いたり閉じたりします。そして、私が知る限り、私はそれをどこにも開いたままにしないでください。以下は私が更新したいコードです。何かご意見は?

    - (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;
    }
4

3 に答える 3

0

DBをバンドルからドキュメントフォルダに移動するにはどうすればよいですか?そこにあることを確認する必要があり、ない場合はコピーします。別の方法でコピーしたが、読み取り専用属性を保持しているか、バンドル内の元の属性をまだ参照している可能性が高いと感じます。

詳細については、を参照してください

SQLiteデータベースファイルをiPhoneアプリのどこに配置しますか?

または、joshperryが言うように、SQLiteBooksサンプルには必要なすべてのコードが含まれています。

于 2009-10-31T13:33:17.253 に答える
0

アプリの起動時にデータベースを1回開き、AppDelegateのapplicationWillTerminateでデータベースを閉じます。

すべてのexecの後で、接続状態をクリアするためにリセットを実行する必要があります。

SQLiteBooksサンプルアプリを見てください。このようにコーディングされています。

于 2009-10-31T07:41:53.863 に答える
0

どうやってloanBookToに行きますか?データベースが開いているときにloanBookToを呼び出すと、開いているというエラーがスローされない場合がありますが、データベースはユーザーがアクセスした状態を保持しています。

また、アプリケーションを閉じて終了するときにデータベースがロック状態を保持することがあるため、以前の障害からロック状態を「継承」することができます。シミュレーターからアプリを削除すると、クリーンなコピーが得られます。

于 2012-05-15T14:11:21.757 に答える