更新/替换两个不同的数据库表列

时间:2015-03-04 10:04:24

标签: ios objective-c iphone sqlite

我有两个不同的数据库,Databse1和Database2,在这两个数据库中都包含相同的名称表" tblSubUnit"这个表有一个列名是"收藏夹",现在我想用Database2表列(收藏夹)替换Database1表列。所以请帮我解决更新/更新问题。

  1. 我为此创建了一个函数来附加这两个数据库,但是在我无法更新/替换列后,请提前帮助我。
  2. 代码:

    - (void)UpdateFavoriteData:(NSString*)query{
    
        NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
    
        NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj"];
    
        if(path==nil){
            path = [[NSBundle mainBundle] pathForResource:@"Base" ofType:@"lproj"];
        }
        NSString *l_DatabasePathFromApp = [path stringByAppendingPathComponent:self.m_DatabaseName];
    
        sqlite3 *bookLoansDB;
        if (sqlite3_open([self.m_DatabasePath UTF8String], &bookLoansDB) == SQLITE_OK) {
            NSString *attachSQL = [NSString stringWithFormat: @"ATTACH DATABASE \'%s\' AS FavoriteData", [l_DatabasePathFromApp UTF8String]];
            char *errorMessage;
            if (sqlite3_exec(bookLoansDB, [attachSQL UTF8String], NULL, NULL, &errorMessage) == SQLITE_OK) {
                sqlite3_stmt *selectStmt;
    
                NSString *selectSQL = @"UPDATE [FavoriteData.SubUnit], [main.SubUnit] SET [FavoriteData.SubUnit].[Faverite] = [main.SubUnit].[Faverite]";
                if (sqlite3_prepare_v2(bookLoansDB, [selectSQL UTF8String] , -1, &selectStmt, nil) == SQLITE_OK) {
                    if(sqlite3_step(selectStmt) == SQLITE_DONE) {
                    }
                }
                else {
                    NSLog(@"Error while Update statement: '%s'", sqlite3_errmsg(bookLoansDB));
                }
            }
            else {
                NSLog(@"Error while attaching databases: '%s'", errorMessage);
            }
        }
        else {
            sqlite3_close(bookLoansDB);
        }
    
    }
    

    我正在尝试这么多的更新查询,但每次都得到相同的结果"更新语句错误"所以请帮助我如何使用另一个数据库表列数据更新一个数据库表列。

1 个答案:

答案 0 :(得分:0)

我得到了解决方案,我终于得到了正确的查询。见下面的答案。

- (void)UpdateFavoriteData:(NSString*)query{

    NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];

    NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj"];

    if(path==nil){
        path = [[NSBundle mainBundle] pathForResource:@"Base" ofType:@"lproj"];
    }
    NSString *l_DatabasePathFromApp = [path stringByAppendingPathComponent:self.m_DatabaseName];


    sqlite3 *bookLoansDB;
    if (sqlite3_open([self.m_DatabasePath UTF8String], &bookLoansDB) == SQLITE_OK) {
        NSString *attachSQL = [NSString stringWithFormat: @"ATTACH DATABASE \'%s\' AS FFavorite", [l_DatabasePathFromApp UTF8String]];
        char *errorMessage;
        if (sqlite3_exec(bookLoansDB, [attachSQL UTF8String], NULL, NULL, &errorMessage) == SQLITE_OK) {
            sqlite3_stmt *selectStmt;

            NSString *selectSQL = @"update FFavorite.SubUnit set Faverite = (SELECT main.SubUnit.Faverite FROM main.SubUnit WHERE FFavorite.SubUnit.unit_id = main.SubUnit.unit_id)";
            if (sqlite3_prepare_v2(bookLoansDB, [selectSQL UTF8String] , -1, &selectStmt, nil) == SQLITE_OK) {
                if(sqlite3_step(selectStmt) == SQLITE_DONE) {
                }
            }
            else {
                NSLog(@"Error while creating select statement: '%s'", sqlite3_errmsg(bookLoansDB));
            }
        }
        else {
            NSLog(@"Error while attaching databases: '%s'", errorMessage);
        }
    }
    else {
        sqlite3_close(bookLoansDB);
    }

}