0

テーブルのレコードを更新する簡単なプログラムがあります

テーブルは「人」で、「名前」と「年齢」の 2 つの列があります。次のように、いくつかのレコードが挿入されました。

name age
tom 20
andy 30
han 25

現在、テーブルの行を更新するプログラムを作成しています。

    NSString *database=[[NSBundle mainBundle] pathForResource:@"mytable" ofType:@"sqlite"];
    sqlite3_open([database UTF8String],&contactDB);
    NSString *text=@"andy";
    NSString *query=[NSString stringWithFormat:@"UPDATE person SET age=%d WHERE name='%@'",30,text];
    sqlite3_stmt *statement;
    sqlite3_prepare_v2(contactDB,[query UTF8String],-1,&statement,NULL);
    sqlite3_finalize(statement);
    sqlite3_close(contactDB);

プログラムは正常に動作しますが、データベースは更新されません (SQLite Manager を使用してデータベースを参照しています)

データベースから読み込もうとすると、うまくいきます:

NSString *database=[[NSBundle mainBundle] pathForResource:@"mytable" ofType:@"sqlite"];
    sqlite3_open([database UTF8String],&contactDB);
    NSString *query1=[NSString stringWithFormat:@"SELECT * FROM person WHERE age=%d;",30];
    sqlite3_stmt *statement;
    sqlite3_prepare_v2(contactDB,[query1 UTF8String],-1,&statement,NULL);
    sqlite3_step(statement);    
    NSString *result=[[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 0)];
    label.text=result;
    sqlite3_finalize(statement);
    sqlite3_close(contactDB);
4

5 に答える 5

2
 -(void)updateSetting:(NSArray *)arr
  {    
 if(sqlite3_open([databasePath UTF8String],&myDatabase)==SQLITE_OK)
  {
 sqlite3_stmt *compiledStmt;

  NSString *sqlStmt=[NSString stringWithFormat:@"UPDATE setting SET    flow='%@',formate='%@'  WHERE primaryKey=%i;",[arr objectAtIndex:0],[arr objectAtIndex:1],1];
  if(sqlite3_prepare_v2(myDatabase, [sqlStmt UTF8String],-1,&compiledStmt, NULL)==SQLITE_OK)    
  {
  NSLog(@"Successful update");
  }
sqlite3_step(compiledStmt);
sqlite3_close(myDatabase);  
  }

  }
于 2012-08-24T07:17:41.900 に答える
1

メソッドを実行する前に、以下のようなチェックを行ってくださいsqlite3_step

const char      *sqlQuery           = "UPDATE SETTINGS SET someFlag = 0";
sqlite3_stmt    *insertStatement    = nil;
int              success            = 0;
if(sqlite3_prepare_v2(sqliteDatabase, sqlQuery, -1, &insertStatement, NULL) == SQLITE_OK)
{
    success = sqlite3_step(insertStatement);

    if(insertStatement)
    {
        sqlite3_finalize(insertStatement);
    }

    if(success == SQLITE_ERROR)
    {
        return NO;
    }
    return YES;
}
return NO;

問題がどこにあるのかを理解できるように。

于 2012-07-10T04:27:19.100 に答える
1

私はすでにこの問題に直面しました。この背後にある問題は、クエリを文字列形式として渡したため;、クエリステートメントの最後で使用する必要があることです。

NSString *query=[NSString stringWithFormat:@"UPDATE questionbank SET age=%d WHERE name='%@';",30,text];
于 2012-07-10T04:08:36.153 に答える
0

この問題の解決策は、メイン バンドルのデータベースが読み取り専用であることです。

XCodeでsqlite3ファイルにデータを挿入できません

于 2012-07-11T15:24:27.547 に答える
0

データベースにアクセスして開くことができるかどうかを確認する必要があります。次のように、更新セグメントを if ステートメントに配置するだけですif(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)

NSLog(@"%s", sqlite3_errmsg(database));また、エラーが発生したかどうかを確認するために、準備後に追加してみてください。

于 2012-07-10T04:03:26.710 に答える