3

SQLiteに問題があります。エントリを挿入しようとすると、エラーが発生します。エラーは「SQLITEMISUSE」で、エラーコード21を使用していることがわかりました。

NSLog(@"ERROR:  Failed to add food!  (code: %d)",sqlite3_step(statement));

コード内のinsertSQL文字列は、必要に応じて適切に作成されます。また、iFunBoxで作成されたテーブルが表示されます。

これが私の挿入方法です:

-(void)saveDataWithCategoryNumber:(int)categoryNumber foodNumber:(int)foodNumber foodName:(NSString *)foodName definiton:(NSString *)definiton ingredients:(NSString *)ingredients calorie:(int)calorie price:(int)price image1:(NSString *)image1 image2:(NSString *)image2 image3:(NSString *)image3 image4:(NSString *)image4 {
sqlite3_stmt    *statement;
const char *dbpath = [databasePath UTF8String];

if (sqlite3_open(dbpath, &foodDB) == SQLITE_OK)
{
    NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO foodDB (categoryNumber, foodNumber, foodName, definiton, ingredients, calorie, price, image1, image2, image3, image4) VALUES (%i, %i, \"%@\",  \"%@\",  \"%@\",  %i,  %i,  \"%@\",  \"%@\",  \"%@\",  \"%@\")", categoryNumber, foodNumber, foodName, definiton, ingredients, calorie, price, image1, image2, image3, image4];

    const char *insert_stmt = [insertSQL UTF8String];
    sqlite3_prepare_v2(foodDB, insert_stmt, -1, &statement, NULL);
    //char *error;
    //sqlite3_exec(foodDB, insert_stmt, NULL, NULL, &error);

    NSLog(@"insertSQL: %@",insertSQL);

    if (sqlite3_step(statement) == SQLITE_DONE)
    {
        NSLog(@"Food added.");
    } else {
        NSLog(@"ERROR:  Failed to add food!  (code: %d)",sqlite3_step(statement));

    }

    sqlite3_finalize(statement);
    sqlite3_close(foodDB);
}}

作成方法が役立つかもしれません:

-(void)createDatabase{
NSString *docsDir;
NSArray *dirPaths;
// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

docsDir = [dirPaths objectAtIndex:0];

// Build the path to the database file
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"foodDB.db"]];

NSFileManager *filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: databasePath ] == NO)
{
    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &foodDB) == SQLITE_OK)
    {
        char *errMsg;
        const char *sql_stmt = "CREATE TABLE IF NOT EXISTS foodDB (ID INTEGER PRIMARY KEY AUTOINCREMENT, categoryNumber INT, foodNumber INT, foodName TEXT, definition TEXT, ingredients TEXT, calorie INT, price INT, image1 TEXT, image2 TEXT, image3 TEXT, image4 TEXT)";

        if (sqlite3_exec(foodDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
        {
            NSLog(@"ERROR:  Failed to create database!");
        }

        sqlite3_close(foodDB);

    } else {
        NSLog(@"ERROR:  Failed to open/create database!");
    }
}

}

4

3 に答える 3

1

奇妙な状況を見つけました。ステートメントで使用した「定義」という単語がエラーの原因です。面白いのは、「定義」という単語がSQLiteキーワードリスト(http://www.sqlite.org/lang_keywords.html)にリストされていないことです。

「definiton」を「def」に置き換えたところ、問題は解決しました。(createDatabaseメソッド)

const char *sql_stmt = "CREATE TABLE IF NOT EXISTS foodDB (ID INTEGER PRIMARY KEY AUTOINCREMENT, categoryNumber INT, foodNumber INT, foodName TEXT, definition TEXT, ingredients TEXT, calorie INT, price INT, image1 TEXT, image2 TEXT, image3 TEXT, image4 TEXT)";

const char *sql_stmt = "CREATE TABLE IF NOT EXISTS foodDB (ID INTEGER PRIMARY KEY AUTOINCREMENT, categoryNumber INT, foodNumber INT, foodName TEXT, def TEXT, ingredients TEXT, calorie INT, price INT, image1 TEXT, image2 TEXT, image3 TEXT, image4 TEXT)";
于 2012-07-11T10:46:26.543 に答える
1

ロギングロジックは2つのsqlite_step()操作を実行していますが、これはせいぜい誤解を招く恐れがあります。

sqlite_step()代わりに、最初の呼び出しの戻りコードをキャプチャして、その値を報告します。

int rc = sqlite3_step(statement);
if (rc == SQLITE_OK)
{
    NSLog(@"Food added.");
} else {
    NSLog(@"ERROR:  Failed to add food!: %d", rc);
}

このロジックをsqlite_xxx()コード内のすべての呼び出しに拡張する必要があります。

于 2012-07-04T09:18:25.640 に答える
1

私の場合、私は使用していました

sqlite3_exec

それ以外の

sqlite3_prepare_v2

これがエラーの原因でした。SQLステートメントを変更すると、問題が解決しました。

于 2021-06-26T01:45:20.693 に答える