Проблема вставки данных в sqlite - PullRequest
0 голосов
/ 29 марта 2011

Я вставляю первую запись в sqlite, и когда я пытаюсь добавить другую, отображается ошибка «База данных заблокирована». код:

- (void) addRecord:(NSMutableDictionary *)recordDict
{

    if(addStmt == nil) {
        const char *sql = "insert into Product(ProID, BarCode , ProductName ) Values(?,?,?)";
        if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
    }
    NSInteger recordId = [[recordDict objectForKey:@"ProID"] intValue];
    NSLog(@"%d",recordId);
    sqlite3_bind_int(addStmt, 1,recordId);
    sqlite3_bind_text(addStmt, 2, [[recordDict objectForKey:@"BarCode"] UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(addStmt, 3, [[recordDict objectForKey:@"ProductName"] UTF8String], -1, SQLITE_TRANSIENT);


    if(SQLITE_DONE != sqlite3_step(addStmt))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    else
    {//SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
        rowID = sqlite3_last_insert_rowid(database);
        NSLog(@"last inserted rowId = %d",rowID);

             //Reset the add statement.
             sqlite3_reset(addStmt);
    }
}

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

«База данных заблокирована» означает, что база данных недоступна для записи, две причины для этого -

1) Вы забыли завершить свой предыдущий скомпилированный оператор или забыли закрыть базу данных, попробуйте это в предыдущем запросе -

sqlite3_finalize(compiledStatement);
sqlite3_close(database);

2) Копируете ли вы базу данных в папку «Документы» перед ее использованием?Вы не можете изменить базу данных в комплекте.Вот код для копирования базы данных в каталог документов.

-(void) checkAndCreateDatabase{
    // Check if the SQL database has already been saved to the users phone, if not then copy it over
    BOOL success;

    // Create a FileManager object, we will use this to check the status
    // of the database and to copy it over if required
    NSFileManager *fileManager = [NSFileManager defaultManager];

    // Check if the database has already been created in the users filesystem
    success = [fileManager fileExistsAtPath:databasePath];

    // If the database already exists then return without doing anything
    if(success) return;

    // If not then proceed to copy the database from the application to the users filesystem

    // Get the path to the database in the application package
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

    // Copy the database from the package to the users filesystem
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

    [fileManager release];
}

Вот как получить путь к базе данных -

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] retain];
    NSLog(@"%@",databasePath);
0 голосов
/ 29 марта 2011

Ничто в твоем коде не выскакивает на меня. Если вы получаете «База данных заблокирована», это означает, что у вас есть открытая транзакция, которая блокирует базу данных. Это может быть в вашем приложении (возможно, в другом потоке) или в другом приложении, которое также обращается к той же базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...