2012-02-28 4 views
2

FMDB에 대한 문서를 수 백만 번 읽은 것처럼 느껴집니다. 왜이 코드가 작동하지 않는지 잘 모르겠습니다. executeUpdate 메서드와 executeMethodWithFormat 및 해당 형식을 시도했지만 어느 것도 작동하지 않는 것 같습니다. _dbArray는 사전 배열입니다. 이 줄은 올바른 값을 반환합니다. 결과를 복사하여 붙여 넣고 터미널에서 쿼리를 실행하면 레코드를 제거합니다. 나는 명백한 무엇인가 놓치고 있냐?FMDB가있는 SQLite 데이터베이스에서 행을 삭제

- (IBAction)deleteDbEntry:(id)sender { 

    // get selected row 
    NSInteger row = [_dataTable selectedRow]; 

    // get the entry number 
    NSString *idToDelete = [[_dbArray objectAtIndex:row] valueForKey:@"entryColumn"]; 

    // open DB for writing 
    if (![db open]) { 
     [db open]; 
    } 

    [db executeUpdate:@"DELETE FROM tbl1 WHERE entry = ?", idToDelete]; 

    // close DB 
    if ([db open]) { 
     [db close]; 
    } 

    [_dataTable reloadData]; 

    return; 
} 

업데이트 : 귀하의 제안을 받았지만 여전히 작동하지 않으며 그 이유를 모르겠습니다. DB의 열기와 닫기가 다른 곳에서 일어나고 있습니다. (@ccgus 감사합니다.) 문자열을 NSNumber (감사합니다 @bryanmac)로 변환하고 있습니다. NSLog(@"myNumber is %@", myNumber); 전화가 올바른 번호를 반환하고 내가 삭제가 일어나지 않았 음을 확인할 수 있습니다. NSLog(@"Error %d: %@", [db lastErrorCode], [db lastErrorMessage]);에 오류가보고되지 않습니다 (Error 0: (null)). 그것은 작동해야처럼

[db executeUpdateWithFormat:@"DELETE FROM tbl1 WHERE entry = %@", myNumber];

[db executeUpdate:@"DELETE FROM tbl1 WHERE id = ?", [NSNumber numberWithInt:myNumber]];

첫 번째 보이지만, 내가 그것을 행을 삭제하지 않습니다 확인했다 : 나는 또한 노력했다. "포인터 변환에 호환되지 않는 정수"가있는 두 번째 오류. 나는 무엇을 놓치고 있습니까? 추가

- (IBAction)deleteDbEntry:(id)sender { 

    // get selected row 
    NSInteger row = [_dataTable selectedRow]; 

    // get the entry number 
    NSString *idToDelete = [[_dbArray objectAtIndex:row] valueForKey:@"entryColumn"]; 

    NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
    [f setNumberStyle:NSNumberFormatterDecimalStyle]; 
    NSNumber *myNumber = [f numberFromString:idToDelete]; 
    NSLog(@"myNumber is %@", myNumber); 

    [db executeUpdate:@"DELETE FROM tbl1 WHERE entry = ?", myNumber]; 
    NSLog(@"Error %d: %@", [db lastErrorCode], [db lastErrorMessage]); 

    [_dataTable reloadData]; 

    return; 
} 
+0

http : // novasys.in/2013/11/22/fmdb-implimentation-ios-applications/ – sohil

+0

http://www.brianjcoleman.com/framework-using-fmdb-to-communicate-with-sqlite-databases/ – sohil

답변

5

귀하의 ID를 int가 다시 보정입니까?

그렇다면 형식이 지정된 업데이트 문에 NSNumber를 전달하십시오.

이 게시물은 NSString을 NSNumber로 변환 할 수 있습니다.

How to delete a row in a sqlite database table? 또한

, 당신이 당신의 문 다음에 오류가 있는지 확인해야합니다 :

How to convert an NSString into an NSNumber

다음
[db executeUpdate:@"DELETE FROM tbl1 WHERE entry = ?", idNumber]; 

는 관련 포스트

NSLog(@"Error %d: %@", [db lastErrorCode], [db lastErrorMessage]); 
+0

ID가 문자열이고, 지금 NSInteger로 변환하려고 시도했지만 여전히 주사위가 없습니다. 오류는 모든 것을 반환합니다. – rick

+0

이것이 바로 올바른 길로 인도합니다. - thanks @bryanmac! – rick

0

시도 :

[database beginTransaction]; 

전에 CRUD 블록과 :

[database commit]; 

업데이 트/삭제/삽입 작업을 실행 한 후. 플러스 executeUpdate

[database executeUpdate:sqlStat];

+0

각 명령문에는 암시 적 트랜잭션이 있습니다 권리? 트랜잭션이 호출을 스팬하고 싶다면 ... – bryanmac

+0

이 아니라면, 나는 sqlite가 트랜잭션이라는 인상하에 있었다. 그래서'beginTransaction'과'commit'은 업데이트, 삽입, 삭제에 필요합니다. 내가 틀렸다면 나를 바로 잡으십시오 ... –

+0

http://sqlite.org/lang_transaction.html :: 데이터베이스를 변경하는 명령 (기본적으로 SELECT가 아닌 모든 SQL 명령)은 트랜잭션이 아직 시작되지 않은 경우 자동으로 시작합니다 효과. – bryanmac

1

당신의 가치를 인쇄 해보십시오 당신이 w를 받고 있는지 확인하기 전에 너 기대하는 모자 야.

데이터베이스를 너무 자주 열고 닫는 것은 좋은 생각이 아닙니다. 한 번 열어 인스턴스의 ivar에 할당 한 다음 dealloc (또는 정말로 닫아야 할 때)을 닫습니다.

-gus (fmdb를 작성한 사람)

+0

감사합니다. @ccgus, 나는 값을 출력하고 있었고 그들은 옳았다. 또한, 프로그램을 실행하는 동안 각각 개폐를 시작할 것입니다. 팁을 주셔서 감사합니다 (그리고 FMDB (및 도토리)에 대한 TON에 감사드립니다)! – rick

관련 문제