1

SQLite データベースを読み書きしようとしていますが、エラーが発生し続けます。データベースが ...iPhone Simulator/Applications/5.1/app#/Documents/kipSQLDB.db に存在することを確認しました

ターミナルから INSERT と SELECT を実行しました。

しかし、アプリからはエラーになります。(追加の質問 - sqlite で mysql の mysql_error のような有益なエラー メッセージを取得する方法はありますか? アプリでエラーが発生すると、いくつかのシンボルしか表示されません。

これが私のコードです:

.h

#import <Foundation/Foundation.h>
#import <sqlite3.h>

@interface SQLiteController : NSObject { 

//file management
NSFileManager *fileManager;
NSString *documentsDirectory;

//sqlite data
sqlite3* databaseHandle;

}

- (void) initSQLiteDB; 

- (void) insertData : (NSString* ) fName : (NSString* ) lName : (NSString* ) companyName; 

- (NSArray* ) getData;

@end

.m

- (void) insertData : (NSString* ) fName : (NSString* ) lName : (NSString* ) companyName { 

NSString* insertStatement = [NSString stringWithFormat:@"INSERT INTO nameList (userFName, userLName, userCompany) VALUES (\"%@\", \"%@\", \"%@\")", fName, lName, companyName];
NSLog(@"%@", insertStatement);

char *error;
if ( sqlite3_exec(databaseHandle, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK) {

    int recordID = sqlite3_last_insert_rowid(databaseHandle);
    NSLog(@"A record was inserted into the database %@ with the id of %i", databaseHandle, recordID);
} else { 
    NSLog(@"Error: %s", error);
}
}

- (NSArray* ) getData {

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

NSString* getStatement = @"SELECT * FROM nameList";

sqlite3_stmt *statement;
if (sqlite3_prepare_v2(databaseHandle, [getStatement UTF8String], -1, &statement, NULL) == SQLITE_OK){

    // Iterate over all returned rows
    while (sqlite3_step(statement) == SQLITE_ROW) {

        int recordID = sqlite3_column_int(statement, 0);
        NSString* fNameFromDB = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)];
        NSLog(@"%@", fNameFromDB);
    }
} else { 
    NSLog(@"No soup for you!");
}

return 0;

}
@end
4

3 に答える 3

1

Try catch 形式を使用し、SQL のエラー タイプをキャッチします。

于 2012-06-18T12:09:18.690 に答える
1

これを試してみてください、私はそれがあなたを助けると思います

 - (void) insertData : (NSString* ) fName : (NSString* ) lName : (NSString* ) companyName { 

    if(insertStatement == nil)
    {

    NSString* insertStatement = [NSString stringWithFormat:@"INSERT INTO nameList (userFName, userLName, userCompany) VALUES (\"%@\", \"%@\", \"%@\")", fName, lName, companyName];
    NSLog(@"%@", insertStatement);
    if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating insert statement. '%s'", sqlite3_errmsg(database));
    }


    sqlite3_bind_text(insertStatement, 1, [Gunameq UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(insertStatement, 2, [Gpassq UTF8String], -1, SQLITE_TRANSIENT);
    if(SQLITE_DONE != sqlite3_step(insertStmt))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    else
        NSLog("Inserted");
    //Reset the add statement.
    sqlite3_reset(insertStatement);
    insertStatement= nil;      

    - (NSArray* ) getData {

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

    NSString* getStatement = @"SELECT * FROM nameList";

    sqlite3_stmt *statement;
    if (sqlite3_prepare_v2(databaseHandle, [getStatement UTF8String], -1, &statement, NULL) == SQLITE_OK){

        // Iterate over all returned rows
        while (sqlite3_step(statement) == SQLITE_ROW) {

            int recordID = sqlite3_column_int(statement, 0);
            NSString* fNameFromDB = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)];
            NSLog(@"%@", fNameFromDB);
        }
    } else { 
        NSLog(@"No soup for you!");
    }

    return 0;

    }
    @end
于 2012-06-18T12:27:39.223 に答える
-1

SQLite は少し扱いに​​くい場合があります。これへのすべてのアクセスは、同じスレッドから行う必要があります。すべての準備ステートメントには、ファイナライズ ステートメントが必要です。

ここで SQLite を使用するためのサンプル プロジェクトを参照できます: https://github.com/AaronBratcher/ABSQLite

より伝統的なデータベースの方法で SQLite にアクセスするためのクラスがあり、より簡単になると感じています。

于 2013-07-11T15:02:18.387 に答える