2012-02-28 21 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に変換しています(thanks @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]];

最初はそう、私はそれが行を削除しません確認している:私も試してみました。 2番目のエラーは "互換性のない整数からポインタへの変換"です。私は何が欠けていますか?追加

- (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 convert an NSString into an NSNumber

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

は、関連記事です:

How to delete a row in a sqlite database table?

また、あなたはあなたの文の後にエラーをチェックしてください:

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

IDは文字列ですが、今はNSIntegerに変換しようとしましたが、ダイスはありません。エラーはすべてが良い返す。 – rick

+0

これは私に正しい道を導きます - ありがとう@bryanmac! – rick

0

試してみてください。

[database beginTransaction]; 

前に、あなたのCRUDブロック、および:

[database commit]; 

更新/削除/挿入操作を実行した後。プラスexecuteUpdateはcorrect-

[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に感謝して、私は値を印刷していて、それは正しいものでした。また、プログラムが実行されている間は、1回ずつ開閉を開始します。あなたのヒント(ありがとう、TON for FMDB(and acorn))に感謝します! – rick

関連する問題