-2

私がやろうとしていることは次のとおりです。

  • ユーザーには、データベース内の既存のレコードが取り込まれたテーブルビューが表示されます。<-ここではすべて問題ありません

  • ユーザーが + ボタンをタッチしてエントリを追加すると、テキストフィールドとボタンを備えた別の非常に単純なビューが表示されます。

  • ボタンの IBAction メソッドで、次のコードを使用して、挿入が行われる "DbOperations" クラスにメッセージを送信しました。

    DbOperations *med = [[DbOperations alloc] init]; [med InsertMedicine:self.txtMedicina.text];

  • その後、ユーザーはテーブルビューに戻り、すぐに新しいエントリを確認できます。しかし...データベースには何も書き込まれていません!

これは、db にエントリを挿入する方法です。

- (void)InsertMedicine:(NSString *) med {

//Check to see if the new medicine already exists
fileMgr = [NSFileManager defaultManager];
sqlite3_stmt *stmt=nil;
sqlite3 *dbase;

const char *sql = "SELECT * FROM listamedicine";

BOOL response= NO;

NSString *database = [self.GetDocumentDirectory stringByAppendingPathComponent:@"db.sqlite"];
sqlite3_open([database UTF8String], &dbase);
sqlite3_prepare_v2(dbase, sql, -1, &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW) {
    if ([med caseInsensitiveCompare:[NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)]] == NSOrderedSame) {
        response=YES;
    }
}
sqlite3_finalize(stmt);
if (!response) {
    //Insert the new medicine
    sqlite3_stmt *stmt=nil;
    NSString *stmsql = [NSString stringWithFormat:@"INSERT INTO listamedicine (nomemedicina) VALUES (\"%@\")", med];
    const char *sql2 = [stmsql UTF8String];

    sqlite3_prepare_v2(dbase, sql2, -1, &stmt, NULL);

    sqlite3_step(stmt);
} else {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Errore" 
                                                    message:@"La medicina che stai cercando di inserire esiste già." 
                                                   delegate:nil 
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
}
sqlite3_finalize(stmt);
sqlite3_close(dbase);

}

そして、これは私のテーブルビューがセルにデータを入力するために使用するコードです:

- (NSMutableArray *)listMedicine {
fileMgr = [NSFileManager defaultManager];
sqlite3_stmt *stmt=nil;
sqlite3 *mybd=NULL;


const char *sql = "SELECT * FROM listamedicine";


NSMutableArray *listaMedicine = [[NSMutableArray alloc]init];

//Open db
NSString *database = [self.GetDocumentDirectory stringByAppendingPathComponent:@"db.sqlite"];
sqlite3_open([database UTF8String], &mybd);
sqlite3_prepare_v2(mybd, sql, -1, &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW) {
    Medicina *myMedicine = [[Medicina alloc]init];
    myMedicine.dataId=[[NSNumber numberWithInt:(int)sqlite3_column_int(stmt, 0)] intValue];
    myMedicine.nome=[NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];

    [listaMedicine addObject:myMedicine];


}
sqlite3_finalize(stmt);
sqlite3_close(mybd); 
return listaMedicine;

}

これは私の「DbOperations」クラスにあります。テーブルビューの cellForRowAtIndexPath メソッドは次のようになります。

static NSString *CellIdentifier = @"CellaMedicina";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellaMedicina"];
}

//Get the object from the array.
DbOperations *med = [[DbOperations alloc] init];
self.medicine = [med listMedicine];
Medicina *medicina = [self.medicine objectAtIndex:indexPath.row];

cell.textLabel.text = medicina.nome;

// Set up the cell

return cell;

私は何を間違っていますか?

4

1 に答える 1

0

ようやく問題が解決しました...データベースをバンドルからドキュメントフォルダーにコピーする方法がありますが、どこにも呼び出していませんでした。

于 2012-04-30T16:45:02.280 に答える