2011-12-29 2 views
2

나는이 문제를 어떻게 해결할 수 있을지 잘 모르겠다.IOS sqlite 업데이트 쿼리 문제

테이블 뷰에 표시되는 이벤트 데이터베이스가 있으며 해당 항목 중 하나를 선택하면 세부 정보가 "즐겨 찾기"로 저장되는 옵션과 함께 db의 열을 업데이트하고 나는 1

내가으로 실행 한 문제로 설정 그들의 "마음에 드는"이 모든 인스턴스를 찾는 두 번째 테이블보기를 1

로 설정이 난 단지 얻는 방법을 알아 낸 것입니다 "updateItem"데이터베이스 쿼리는 선택한 항목의 경로에서 작동하지 않습니다. 각 tableview는 다른 경로에 같은 항목을 표시하므로 "updateItem"쿼리는 "즐겨 찾기"테이블보기를 사용할 때 데이터베이스의 잘못된 항목을 업데이트합니다.

나는 UpdateItemAtID 메서드에서 aryDatabase를 사용하고 있고 즐겨 찾기 쿼리는 aryDatabaseFav를 사용한다는 것을 알고 있습니다. 내가 즐겨 찾기 tableview 주위에 두 번째 배열을 만들어야 만 했어, 아마 원래의 aryDatabase 배열로 2 개의 다른 배열을 갖는 것보다 원하는 모든 것을 가질 수있는 더 좋은 방법이있다.

여기에 두 개의 SELECT 문과 업데이트 쿼리에 대한 코드가 있습니다. 항목 경로를 필요로 할 수있는 더 좋은 방법이 있습니까?

-(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가 구조화되는 방식과 비슷하게 보입니다.

싱글 톤 개체를 사용하여 다음 접근 방식을 권장합니다.

싱글 톤 객체는 몇 개의보기 컨트롤러 또는 클래스간에 공유되는 컨테이너처럼 작동합니다.

문제로 돌아 가면 다른 uitableview의 객체 (singleEvent)를 Singleton에 저장하여 가져올 수 있습니다.

여기에는 단일 이벤트 개체에 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");  }