2011-04-15 1 views
0

sqliteデータベースを正常に更新できますが、主キーをtableviewで選択した行に対応させたいと思います。私が苦労しているのは、tableviewからindexpathを取得し、データベースを更新するTodoクラスに渡す必要があるからです。ここでは、コードです:iphone sqliteのプライマリキーにindexPath.rowをバインドする方法

テーブルビュー(RootViewController):

- (void)updateStatus:(id)sender { // called when a user presses the button to alter the status 

NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[sender superview]]; 
NSLog(@"The row id is %d", indexPath.row); // This works 

todoAppDelegate *appDelegate = (todoAppDelegate *)[[UIApplication sharedApplication] delegate]; 
Todo *td = [appDelegate.todos objectAtIndex:indexPath.row]; 

self.selectedIndexPath = indexPath; 
NSLog(@"Selected index path is %i", self.selectedIndexPath); 

if (td.status == 0) {  
    [td updateStatus:1]; 
    NSLog(@"Status is %i",td.status); 
} 
else { 
    [td updateStatus:0]; 
    NSLog(@"Status is %i",td.status); 
} 

[appDelegate.todos makeObjectsPerformSelector:@selector(dehydrate)]; 
} 

藤堂クラス:

- (void) dehydrate { 
if (dirty) { // If the todo is “dirty” meaning the dirty property was set to YES, we will need to save the new data to the database. 
if (dehydrate_statment == nil) { 
    const char *sql = "update todo set complete = ? where pk= ?"; // PK needs to correspond to indexpath in RootViewController 

    if (sqlite3_prepare_v2(database, sql, -1, &dehydrate_statment, NULL) != SQLITE_OK) { 
     NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database)); 
    } 
} 

sqlite3_bind_int(dehydrate_statment, 2, self.primaryKey); 
sqlite3_bind_int(dehydrate_statment, 1, self.status); 
int success = sqlite3_step(dehydrate_statment); 

if (success != SQLITE_DONE) { 
    NSAssert1(0, @"Error: failed to save priority with message '%s'.", sqlite3_errmsg(database)); 
} 
sqlite3_reset(dehydrate_statment); 
dirty = NO; 
NSLog(@"Dehydrate called"); 
}  
} 

多くの感謝!

+0

あまりにも多くのコードだけ少数の人々が読まれます=ロング&複雑な質問...あなたの助けのための –

+0

感謝を使用することです。 – medley

答えて

0

私はあなたのコードから、それぞれのTODOが同じPK(indexPath.row)を取得すると仮定しなければなりません。

離れてあなたの 'performSelector' をブレークし、それぞれがこのように、インデックスをTODO渡し

for (Todo *todo in appDelegate.todos) { 
     [todo dehydrate:indexPath.row]; 
    } 

、再宣言として脱水:

 - (void) dehydrate:(int) primaryKey { // use pk here ... } 
+0

それぞれのTODOは対応するindexpath.rowでPKを更新する必要があります。それをすべて一緒に接続する方法、つまり、Rootviewからindexpath.rowまたはタグをTodoクラスの更新メソッドに取得する方法がわからないだけです。ありがとう。 – medley

+0

私はこれを試しましたが、それは理由でクラッシュします: ' - [Todo dehydrate:]:インスタンスに送られた認識できないセレクタ。 – medley

+0

"認識できないセレクタ"は、メソッドが宣言されているシグネチャとは異なるシグネチャ(または宣言されていないシグネチャ)でメソッドを呼び出すことを意味します。脱水物をintに渡していますか?メソッドのシグネチャは.hファイルのintで宣言されていますか? – Rayfleck

0

あなたのコードに関するいくつかの発言を:

  1. AppDelegateを使用してグローバルのデータをホストする代わりに、シングルトンクラス
  2. [appDelegate.todos makeObjectsPerformSelector:@selector(dehydrate)]を使用します。あなたがやりたいことを見て複雑です。 todoをpkでターゲティングする方法がより良いでしょう。あなたの質問について

:indexPath行とPKの間にはcorrespondanceがない場合

あなたのセルを使用すると、「リンク」、それらをすることを可能にするための主キー/ TODOデータをホストする必要があります。あなたがあなた自身のセルのサブクラスを作りたくない場合は

一つの簡単なトリックは、cell tag property

+0

こんにちは、提案のおかげで。私は複雑さに関してあなたに同意しますが、これは私が拡張しているチュートリアルであり、どのように複雑さを少なくするかはわかりません。タグ付けに関して、私は持っています:[accessoryButton setTag:indexPath.row];私はそれを取得する方法がわかりません。再度、感謝します。 – medley

+0

あなたの質問とコメントを見て、おそらくあなたはいくつかの簡単な例から始めるべきです...あなたはsender.tagからあなたのタグを取り出すかもしれません... –

関連する問題