1

私はObjectiveCを使用してsqliteデータベースに挿入しようとしています。以下は私のコードです。

-(void)insertCustomer:(CustomerDetails *)cd {

CustomerDetails *cDetails=[[CustomerDetails alloc] initWithIdNumber:cd.idNumber name:cd.name surname:cd.surname];

NSString *name= cDetails.name;
NSString *surname=cDetails.surname;
NSString *idNumber=cDetails.idNumber;


NSString *insertQuery=[NSString stringWithFormat:@"INSERT INTO CUSTOMER_DETAILS(Name,Surname,ID_Number) VALUES(?,?,?);"];
sqlite3_stmt *insertStatement;
sqlite3_prepare_v2(database, [insertQuery UTF8String], 1, &insertStatement, NULL);

sqlite3_bind_text(insertStatement, 1,[name UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(insertStatement, 2,[surname UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(insertStatement, 3,[idNumber UTF8String], -1, SQLITE_TRANSIENT);

sqlite3_step(insertStatement);
sqlite3_finalize(insertStatement);
sqlite3_close(database);

}

これは何も挿入していません。また、insertStatementをデバッグするときにnullのように見える場合は、Objective Cを初めて使用するので、助けていただければ幸いです:)

ありがとう

4

1 に答える 1

2

の3番目のパラメーターはsqllite3_prepare_v2、SQLステートメントから読み取るバイト数です。1を渡しているので、1バイトが読み取られます。つまり、SQLステートメントを実行しようとしています"I"。これは機能せず、sqllite_prepare_v2おそらく失敗しているため、何も割り当てられていませinsertStatementん。ただし、エラーコードの戻り値をチェックしていないため、コードは続行されます。

-1を渡すと、UTF8文字列のヌルターミネータまでprepare関数を読み取ることができます。言い換えれば、これは機能するはずです:

sqlite3_prepare_v2(database, [insertQuery UTF8String], -1, &insertStatement, NULL);

また、コードでsqllite APIを使用する場合は、実際にエラーをチェックする必要があります。これにより、将来的に他の問題が回避または説明される可能性があります。ドキュメントによると:

成功すると、sqlite3_prepare()ファミリーのルーチンはSQLITE_OKを返します。それ以外の場合は、エラーコードが返されます。

于 2012-09-02T16:05:34.483 に答える