无法更新数据库

时间:2011-10-04 15:24:46

标签: iphone sqlite

我无法更新数据库。我相信这可能是因为它可能是只读的,但我不确定。我在控制台中创建了数据库,下面的代码将数据库添加到项目文件夹中,而不是在外部引用它。以下是将文件传输到项目文件夹的代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {

  databaseName = @"databasenew.sql";


/* copy over to phone code */

   NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,          NSUserDomainMask,YES) objectAtIndex:0]; 
   NSString *sqlFile =[documentDirectory stringByAppendingPathComponent:@"databasenew.sql"];

    if (![[NSFileManager defaultManager] fileExistsAtPath:sqlFile]) {
        NSString *bundleSql = [[NSBundle mainBundle] pathForResource:@"databasenew" ofType:@"sql"];

        NSError *error = nil;
        [[NSFileManager defaultManager] copyItemAtPath:bundleSql toPath:sqlFile error:&error];

        if (error) {
            NSLog(@"Could not copy json file: %@", error);
        }
        else{
            NSLog(@"yea");
        }
    }
    else{

        NSLog(@"transfer complete");
    }
    NSString *bundleSql = [[NSBundle mainBundle] pathForResource:@"databasenew" ofType:@"sql"];

    databasePath = bundleSql;

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

以下是我尝试更新的代码

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName
     attributes: (NSDictionary *)attributeDict
    {

    if ([elementName isEqualToString:@"Message"])
    {
        NSLog(soapResults);  
        NSString *convertString = soapResults;
        check = [convertString intValue];
        NSLog(@"user is");
        NSLog(user);
        if(check > 0){

            databaseName = @"databasenew.sql";
            NSString *bundleSql = [[NSBundle mainBundle] pathForResource:@"databasenew" ofType:@"sql"];
            databasePath = bundleSql;

            sqlite3 *database;

            if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
                const char *sqlStatement = "UPDATE people set user = 'munch'";
                sqlite3_stmt *compiledStatement;
                if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
                    NSLog(@"success");
                    NSLog(soapResults);
                    BOOL success = sqlite3_step(compiledStatement);
                    if (success != SQLITE_DONE) {
                        BOOL myBool=YES; 
                        NSLog([NSString stringWithFormat:@"My Bool value : %d",success]); 

                    } 
                }else{
                    NSLog(@"the fail ispreparing something");

                    NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database));
                }

                sqlite3_finalize(compiledStatement);

            }else{
                NSLog(@"fail");
            }

            sqlite3_close(database);
            NSString *string = [NSString stringWithFormat:@"%d", check];
            NSLog(string);
            NSLog(@"lolololol"); 
            check = 0;
            [self Bootup];

        }else{
                 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Problem!" message:@"Incorrect Username or Password"
                                                               delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:@"Yes", nil];
            [alert show];
            [alert release];
        }
      //  gotoContent = checkConfirm;
    }

    if( [elementName isEqualToString:@"ValidateUserResponse"])
    {
        if(!soapResults)
        {
            soapResults = [[NSMutableString alloc] init];
            NSLog(soapResults);
            NSLog(@"above is soap validate user");
        }

        recordResults = TRUE;
    }
}

我已经完成了我的NDlog调试,如果更新代码成功,它会说“成功”,但数据库本身不会更新。这是什么原因?

2 个答案:

答案 0 :(得分:0)

您正在为更新声明伪造一些代码

//the binding part is missing in your code , you need to write after Prepare statement.

sqlite3_bind_text(compiledStatement, 1, [string UTF8String], -1, SQLITE_TRANSIENT);

if(SQLITE_DONE != sqlite3_step(compiledStatement))
NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(database));

sqlite3_reset(compiledStatement);

通过iphonesdkarticles.com。

这将解决您的错误。

答案 1 :(得分:0)

-(BOOL) someUpdateFunction {
    BOOL updatedSuccessfully = NO;

    // Open the database.
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        NSString *updateQuery = [[NSString alloc] initWithFormat:@"UPDATE people SET user = 'terror' WHERE user = 'greg'"];
        const char *query = [updateQuery UTF8String];
        [updateQuery release];

        sqlite3_stmt *statement; 
        int res = (sqlite3_prepare_v2( database, query, -1, &statement, NULL));

        if(res == SQLITE_OK) {
            int result = sqlite3_step(statement);
            if(result == SQLITE_DONE) {
                updatedSuccessfully = YES;
                sqlite3_finalize(statement);
            }else {
                NSLog(@"Failed with error code: %d", result);
            }
        }else {
            NSLog(@"Failed to prepare the update query with error code: %d", res);
        }
    }else {
        NSLog(@"Failed to open the database");
    }

    sqlite3_close(database);
    //NSLog(updatedSuccessfully);
    //NSLog(@"The value of the bool is %@\n", updatedSuccessfully);
    return updatedSuccessfully;
}

我在聊天室里提供了这个。谢谢小伙子们。

请记住将数据库复制到其他设备。您可以使用以下代码找到数据库路径:

- (NSString *) dataFilePath:(NSString *) dbName { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:dbName];
    return dbPath;
}

-(BOOL)buildtheDB{
    BOOL updatedSuccessfully = NO;

    NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES) objectAtIndex:0]; 
    NSString *sqlFile =[documentDirectory stringByAppendingPathComponent:kDatabaseFileName];

    if ([[NSFileManager defaultManager] fileExistsAtPath:sqlFile] == NO) {
        NSString *bundleSql = [[NSBundle mainBundle] pathForResource:@"database" ofType:@"sqlite"];

        NSError *error = nil;

        BOOL databaseCopied = [[NSFileManager defaultManager] copyItemAtPath:bundleSql toPath:sqlFile error:&error];
        if (databaseCopied == NO) {
            if (error) {
                NSLog(@"Could not copy database file with error: %@", [error localizedDescription]);
            }
        }else {
            NSLog(@"Database copied successfully");
        }
    }
    else{
        NSLog(@"Database already copied");
    }

    return updatedSuccessfully;
}