2014-06-25 58 views
0

因此,我的目标是:我需要将同步数据库附加到我的主数据库,并更新或替换我的主数据库中的任何字段。所以我先把附上我的数据库。然后我试图通过所有的表格。这里是一个古怪的部分:在我的主查询字符串内部,当我说:SELECT name FROM sqlite_master if语句不执行并且说“错误:不是错误”。现在,当我将主查询告诉SELECT名称FROM sync_db.sqlite_master时,执行if语句。但是,我收到一条错误消息,说没有这样的表:sync_db.sqlite_master存在。有人可能会通过适当的协议走过我吗?提前致谢。附加数据库时错误不是错误的sqlite数据库

//Atataching the sync db to the master db 

    NSString *attachSQL = [NSString stringWithFormat:@"ATTACH DATABASE \'%@\' AS sync_db", dbPathSync]; 

    NSLog(@"Here's the arratch string: %@", attachSQL); 

    // 
    if ((errorNum = sqlite3_exec(mainOpenHandle, [attachSQL UTF8String], NULL, NULL, &errorMessage)) == SQLITE_OK) { 

     NSString *masterQuery = [NSString stringWithFormat:@"SELECT name FROM sync_db.sqlite_master WHERE type='table';"]; 
     const char *masterStmt = [masterQuery UTF8String]; 
     sqlite3_stmt *statement; 

     //If statement does not execute and prints error saying "not an error" when 
     //place SELECT from "sqlite_master" inside master query. 
     if (sqlite3_prepare_v2(syncOpenHandle, masterStmt, -1, &statement, NULL)) { 
      while (sqlite3_step(statement) == SQLITE_ROW) { 

       NSString * currentTable = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)]; 

       NSLog(@"Here's the current table: %@",currentTable); 

       //This is where the magic happens. If there are any keys matching the database, it will update them. If there are no current keys in the database, the query will insert them. 
       if ([currentTable isEqualToString:@"USER_DATA"] == NO && [currentTable isEqualToString:@"USER_ACTIVITY"]== NO && [currentTable isEqualToString:@"USER_ITINERARY"] == NO) { 
        NSString *tblUpdate = [NSString stringWithFormat:@"INSERT or REPLACE INTO main.%@ SELECT * FROM sync_db.%@;",currentTable, currentTable]; 
        const char *updateStmt = [tblUpdate UTF8String]; 
        if ((errorNum = sqlite3_exec(mainOpenHandle, updateStmt, NULL, NULL, &errorMessage))!= SQLITE_OK) { 

         if (errorNum == 1) { 
          //A database reset is needded 

          self->isResetDataBase = YES; 
         } 
         dbErr = YES; 
        } 
       } 
      } 
      NSLog(@"Error sync ... '%s'", sqlite3_errmsg(syncOpenHandle)); 
     } 
     NSLog(@"Erorr syncing the database: Code: %d, message: '%s'", error,sqlite3_errmsg(mainOpenHandle)); 

     NSLog(@"Error sync ... '%s'", sqlite3_errmsg(syncOpenHandle)); 
     sqlite3_finalize(statement); 
     //Detaching the database from the mainDB 
     NSString *detachSQL = [NSString stringWithFormat:@"DETACH DATABASE sync_db"]; // reference sync db 
     if ((errorNum = sqlite3_exec(mainOpenHandle, [detachSQL UTF8String], NULL, NULL, &errorMessage))!= SQLITE_OK) { 

      NSLog(@"Detatched syncDb Failed. ErrorMessage = %s ", errorMessage); 


     } 
    } 


} 



NSLog(@"Error sync ... '%s'", sqlite3_errmsg(syncOpenHandle)); 

//Closing the database when finished. 
if (mainOpenHandle != nil) { 
    sqlite3_close(self.mainOpenHandle); 
} 

if (syncOpenHandle != nil) { 
    sqlite3_close(self.syncOpenHandle); 
    NSError *err; 
    int success = [fileManager fileExistsAtPath:dbPathSync]; 
    if (success) { 
     [[NSFileManager defaultManager]removeItemAtPath:dbPathSync error: &error]; 
    } 

} 

if (userOpenHandle != nil) { 
    sqlite3_close(self.userOpenHandle); 
} 

然后我尝试遍历所有行。但这是一个古怪的部分。

回答

1

您应该将sqlite3_prepare_v2的结果与SQLITE_OK进行比较。

如果只是做:

if (sqlite3_prepare_v2(syncOpenHandle, masterStmt, -1, &statement, NULL)) { 

那么if语句只会如果有错误成功。你想:

if (sqlite3_prepare_v2(syncOpenHandle, masterStmt, -1, &statement, NULL) == SQLITE_OK) { 

你也应该更新代码,只在if声明else块记录错误。

if (sqlite3_prepare_v2(syncOpenHandle, masterStmt, -1, &statement, NULL) == SQLITE_OK) { 
    // process query 
} else { 
    // log error here 
}