Невозможно обновить базу данных - PullRequest
0 голосов
/ 04 октября 2011

У меня проблемы с обновлением базы данных. Я полагаю, что из-за того, что это возможно только для чтения, однако я не уверен. Я создал свою базу данных в консоли, и приведенный ниже код добавляет базу данных в папку проекта, а не ссылается на нее внешне. Вот код для передачи файла в папку проекта

- (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 голосов
/ 05 октября 2011
-(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;
}
0 голосов
/ 05 октября 2011

Вы подделываете некоторый код для оператора обновления

//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.

Это исправит вашу ошибку.

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