2011-12-29 58 views
2

我對IOS編程非常陌生,所以我不太確定如何最好地解決這個問題。iOS sqlite更新查詢問題

我有一個正在顯示在桌面視圖上的事件的數據庫,當你選擇其中一個項目時,它顯示了詳細信息以及將其保存爲「最喜歡」的選項,該選項只更新了數據庫中的列,它設置爲1。

我有一個看起來已設置爲1

我所遇到的問題有自己的「最愛」的所有實例第二個表的看法是,我只是想出如何獲得「updateItem」數據庫查詢將從您選擇的項目路徑起作用。由於每個tableview在不同路徑上顯示相同的項目,因此當您使用「收藏夾」表格視圖時,「updateItem」查詢正在更新數據庫中的錯誤項目。

我知道在UpdateItemAtID方法中,它使用aryDatabase,並且收藏夾查詢使用aryDatabaseFav。我不得不創建第二個數組來解決收藏夾tableview,也許有更好的方法來獲得我想要的所有東西,只需要原始的aryDatabase數組而不是兩個不同的數組。

這裏是我有兩個選擇語句以及更新查詢的代碼,有沒有更好的方式,我可以解決需要項目的路徑?我的理解

-(void)readItems { 

if (!database) return; // earlier problems 
if (!selStmt) 
{ 
    const char *sql = "SELECT * FROM Events;"; 
    if (sqlite3_prepare_v2(database, sql, -1, &selStmt, NULL) != SQLITE_OK) 
    { 
     selStmt = nil; 
    } 
} 
if (!selStmt) 
{ 
    NSAssert1(0, @"Can't build SQL to read items [%s]", sqlite3_errmsg(database)); 
} 

// loop reading items from list 
[aryDatabase removeAllObjects]; // clear list for rebuild 
int ret; 
while ((ret=sqlite3_step(selStmt))==SQLITE_ROW) 
{ // get the fields from the record set and assign to item 
    //bindings omitted 
    [aryDatabase addObject:se]; // add to list 
    [se release]; // free item 
} 
sqlite3_reset(selStmt); // reset (unbind) statement 
selStmt = nil;} 

-(void)readFavItems { 
if (!database) return; // earlier problems 
if (!selStmt) 
{ 
    const char *sql = "SELECT * FROM Events WHERE mySchedule = 1;"; 
    if (sqlite3_prepare_v2(database, sql, -1, &selStmt, NULL) != SQLITE_OK) 
    { 
     selStmt = nil; 
    } 
} 
if (!selStmt) 
{ 
    NSAssert1(0, @"Can't build SQL to read items [%s]", sqlite3_errmsg(database)); 
} 

// loop reading items from list 
[aryDatabaseFav removeAllObjects]; // clear list for rebuild 
int ret; 
while ((ret=sqlite3_step(selStmt))==SQLITE_ROW) 
{ // get the fields from the record set and assign to item 
    //bindings omitted 
    [aryDatabaseFav addObject:se]; // add to list 
    [se release]; // free item 
} 
sqlite3_reset(selStmt); // reset (unbind) statement 
selStmt = nil;} 

-(void)updateItemAtID:(NSIndexPath *)path { 
singleEvent *i = (singleEvent *)[aryDatabase objectAtIndex:path.row]; 
int ret; 

const char *sql = "UPDATE events SET mySchedule = ? WHERE _id = ?;"; 

if (!updStmt) 
{ // build update statement 
    if ((ret=sqlite3_prepare_v2(database, sql, -1, &updStmt, NULL))!=SQLITE_OK) 
    { 
     NSAssert1(0, @"Error building statement to update items [%s]", sqlite3_errmsg(database)); 
    } 
} 
// bind values to statement 
NSInteger m = i.intId; 
sqlite3_bind_int(updStmt, 1, m); 
NSInteger p = i.intPk; 
sqlite3_bind_int(updStmt, 2, p); 

if ((ret=sqlite3_step(updStmt)) != SQLITE_DONE) 
{ 
    NSAssert1(0, @"Error updating values [%s]", sqlite3_errmsg(database)); 
} 
    sqlite3_reset(updStmt); 
} 

回答

0

基地,好像當他們負載,因爲你正在使用NSIndexPath數據可能是不同的NSArray的結構方式。

我建議使用Singleton對象以下方法。

Singleton對象的工作原理類似於在幾個視圖控制器或類之間共享的容器。

回到您的問題,您可以將對象(singleEvent)存儲在Singleton中,供其他uitableview使用。

這是假設您的singleEvent對象具有諸如Id之類的關鍵字段。

希望這會有所幫助。

1

我更新了代碼,並在sqlite3_bind_text上得到結果= 0。是否意味着它沒有更新或沒有更新記錄?不知道此時還有什麼要做...

BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bh.sqlite"]; 
    success = [fileManager fileExistsAtPath:writableDBPath]; 

    NSLog(writableDBPath); 

    if(success) 
    { 
     const char *dbPath= [writableDBPath UTF8String]; 

     //[G msgBox:writableDBPath title:@""]; 

     //const char *dbpath = [databasePath UTF8String]; 
     sqlite3_stmt *statement; 
     sqlite3 *contactDB = NULL; 

     if (sqlite3_open(dbPath, &contactDB) == SQLITE_OK) 
     { 

      NSString *updateSQL = @"UPDATE account SET name = ? "; 
      const char *update_stmt = [updateSQL UTF8String]; 


      int e = sqlite3_prepare_v2(contactDB, update_stmt, -1, &statement, nil); 
      if(e != SQLITE_OK) { 
       NSLog(@"Problem with updateEntryWithUniqueID"); 
       NSLog(@"Error Code: %d, message '%s'", e, sqlite3_errmsg(contactDB)); 

       return; 
      }else{ 
       NSLog(@"Updated"); 
       [G setNickname:thisNickname]; 
      } 

      int result=sqlite3_bind_text(statement, 1, [thisNickname UTF8String], -1, SQLITE_TRANSIENT); 
      NSLog(@"bind result= %i", result); 


      if(sqlite3_step(statement) != SQLITE_DONE) { 
       NSLog(@"Problems updating"); 
      } 

      /* Finished */ 
      sqlite3_finalize(statement); 
     }else 
     { 
      NSLog(@"Can not open DB."); 
     } 

    }else{ 
     NSLog(@"path not exsist");  }