Aravindhan
Aravindhan

Reputation: 15628

error while trying to insert data into a database using sqlite

Library routine out of sequence
May i know why this error coming (this error comes in insert function)

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

-(void) readAnimalsFromDatabase { // Setup the database object

// Init the animals Array
animals = [[NSMutableArray alloc] init];
// Open the database from the users filessytem
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    // Setup the SQL Statement and compile it for faster access


    const char *sqlStatement = "select * from sq";
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
        // Loop through the results and add them to the feeds array
            NSLog(@"working");
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
            // Read the data from the result row
            NSString *aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];

            // Create a new animal object with the data from the database
            anim *animal = [[anim alloc] initWithName:aName];

            // Add the animal object to the animals Array
            [animals addObject:animal];

            [animal release];
        }
    }
    // Release the compiled statement from memory
    sqlite3_finalize(compiledStatement);

}
sqlite3_close(database);

} //this function is called from another file by button press event

-(void)insert:str  
{  
const char *sql = "insert into sq(name) Values ?";  

sqlite3_stmt *compiledStatement;  

if(sqlite3_prepare_v2(database, sql, -1, &compiledStatement, NULL) != SQLITE_OK)  

NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));     
sqlite3_bind_text(compiledStatement, 1, [str UTF8String], -1, SQLITE_TRANSIENT);  

    if(SQLITE_DONE != sqlite3_step(compiledStatement))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    else
    sqlite3_reset(compiledStatement) ;
}

Upvotes: 0

Views: 579

Answers (1)

Jhaliya - Praveen Sharma
Jhaliya - Praveen Sharma

Reputation: 31722

That error message maps to SQLITE_MISUSE (the source code is available at http://www.sqlite.org).

See http://www.sqlite.org/faq.html#q6 for limitations on using an sqlite3 * database handle from more than one thread. Effectively, you are allowed to reuse a database handle and statements across threads but one thread must be completely done accessing the database before the other thread starts (i.e. overlapping access is not safe). That sounds like what's happening for you and is consistent with the SQLITE_MISUSE error code.

More See the below SO post ..

How to properly call SQLite functions from background thread on iPhone?

Upvotes: 2

Related Questions