0

このコードを使用してSqlite3データベースから行を削除していますが、機能していません。挿入、更新、選択クエリは正常に機能していますが、削除ステートメントがコードで機能していません。

 -(void)delete{

        str=title.text;
        sqlite3_stmt *selectstmt;
        if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
            NSString *deleteSQL = [NSString stringWithFormat: @"delete from ToDo where title=\"%@\"",str];
            NSLog(@"%@",deleteSQL);
            const char *sql = [deleteSQL UTF8String];
            sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL); 
            if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) 
               NSLog(@"success");
            else
              NSAssert1(0, @"Error while creating delete statement. '%s'", sqlite3_errmsg(database));            
            }
            sqlite3_finalize(selectstmt);
            sqlite3_close(database);
        }

私は何が間違っているのですか?

4

3 に答える 3

3

以下のコードを使用して、sqliteデータベースから特定のリコアを削除できます:-

NSDictionary *d =(NSDictionary *) [YourMutableArray objectAtIndex:0];
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [path objectAtIndex:0];
NSString *dbPath =[documentsDir stringByAppendingPathComponent:@"db.sqlite"];
sqlite3_open([dbPath UTF8String], &database);

if(deleteStmt == nil) 
{

    NSString *deleteStatementNS = [NSString stringWithFormat:
                                   @"delete from tbl_postoffice where type = '%@'",
                                   urusniqIDentifire];
    const char *sql = [deleteStatementNS UTF8String];

    //const char *sql ="delete from tbl_todo where type = yourDbfildeRecored";
    if(sqlite3_prepare_v2(database, sql, -1, &deleteStmt, NULL) != SQLITE_OK)
        NSAssert1(0, @"Error while creating delete statement. '%s'", sqlite3_errmsg(database));
}

//When binding parameters, index starts from 1 and not zero.
sqlite3_bind_text(deleteStmt, 1, [[d valueForKey:@"type"] UTF8String], -1, SQLITE_TRANSIENT);
if (SQLITE_DONE != sqlite3_step(deleteStmt)) 
    NSAssert1(0, @"Error while deleting. '%s'", sqlite3_errmsg(database));

sqlite3_reset(deleteStmt);

それがあなたのために役立つことを願っています

于 2012-10-03T05:43:09.677 に答える
3

こんにちは、それを見てください。

パラメータを渡す際に間違ったことをしていると思います。

編集:

    str=title.text;
    [self openDatabase];//Logic to open database goes here
    sqlite3_stmt *stmt=nil;
    BOOL status=FALSE;

    NSString *deleteSQL = [NSString stringWithFormat: @"delete from ToDo where title='%@'",str];
    NSLog(@"%@",deleteSQL);
    const char *sql = [deleteSQL UTF8String];


   //const char *sql ="delete from ToDo where title='%@'";

   if(sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK)
   {
         sqlite3_bind_text(stmt, 1, [_testId UTF8String], -1, SQLITE_STATIC);

         if(SQLITE_DONE != sqlite3_step(stmt))
               { 
                 NSLog(@"Error while Deleting");
               }


    }
    sqlite3_finalize(stmt);
  [self closeDatabase];//Logic to close database goes here
于 2012-10-03T05:24:17.477 に答える
0

はい@jasonCocoは正しいです。ステートメントを2回準備し、prepareステートメントの後でstepを呼び出していません。prepareの後にこれを呼び出してみてください。

if (sqlite3_step(selectstmt) == SQLITE_DONE)
{
    NSLog(@"success");
}
于 2012-10-03T05:22:35.763 に答える