3

これを機能させるのに問題があります。

これは私が実行したいコードです:

[self openDB];
sqlite3_stmt *statement;
NSString *sql2 = [NSString stringWithFormat:@"INSERT INTO CheckList (CLName, DateAdd, Active, Costum, Percentage, UserId) VALUES ('ola232332332324', '2012-02-03', 1, 1, NULL, 1)"];
if(sqlite3_prepare_v2(db, [sql2 UTF8String], -1, &statement, NULL) == SQLITE_OK)
{
    alert1 = [[UIAlertView alloc]
              initWithTitle:@"Grats" message:@"The query was executed!" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles: nil];
    [alert1 show];
    [alert1 release];
} 
else {
    NSAssert(0, @"Failed to execute");
}
sqlite3_finalize(statement);

そして、これは私がdbを呼び出すために使用するコードです:

-(NSString *) filePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    return [documentsDir stringByAppendingPathComponent:@"prosegur.sqlite"];
}

-(void) openDB {
    sqlite3_open([[self filePath] UTF8String], &db);
    if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK){
        NSAssert(0, @"Failed to open db");
    }
}

編集: FMDBを使おうとすると、コードは次のようになります。

FMDatabase *database = [FMDatabase databaseWithPath:@"prosegur.sqlite"];
if([database open]){
    NSLog(@"yes");
    [database executeUpdate:@"INSERT INTO CheckList (CLName, DateAdd, Active, Costum, UserId) VALUES ('cenas', '2012-02-0',  1, 1, 1)"];}
else
{
    NSLog(@"not");
}

[データベースオープン]検証を通過しますが、クエリは実行されません。

編集2:提案されたことをすでに実行しました。データベースを作成し、その内部でクエリを実行すると思い始めていますが、テーブルが存在しないため、その事実を無視します。

更新されたコードは次のとおりです。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [[paths objectAtIndex:0] retain];
NSString *path = [[docsPath stringByAppendingPathComponent:@"prosegur.sqlite"] retain];

FMDatabase *database = [FMDatabase databaseWithPath:path];
[database open];
if([database open])
{
    NSLog(@"yes");
    [database executeUpdate:@"INSERT INTO CheckList (CLName) VALUES (?)", @"cenas"];
}
else 
{
    NSLog(@"no");
}
[database close]; 
4

4 に答える 4

2

ばかげた質問かもしれませんが、ステートメントを準備sqlite3_prepare_v2するだけで、実際には実行しないことをご存知ですか?また、実際に挿入を行うには、を呼び出す必要があります。sqlite3_step

代わりに使用することもできますsqlite3_exec。これは、2ステップの準備/実行を行わずにステートメントを実行するだけです。

于 2012-05-25T12:20:27.260 に答える
2

iOS開発でstandartsqlite3apiを使用しているときに、多くの頭痛の種がありました。FMDBフレームワークをチェックしてください。使い方はとても簡単で、ウェブ上にはたくさんのチュートリアルがあります。

そのフレームワークが必要ない場合はNSError、クエリ実行時のエラーをキャッチするためにを使用してみてください。

于 2012-05-25T12:35:55.990 に答える
1

サンプル例。

+(BOOL)InsertDataInPin:(NSString *)pin
    {
        NSString *databasePath =Your DatabasePath;

        NSString *SQL=@"INSERT INTO pincode Values(?)";
        sqlite3_stmt *dataset;


        if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK ) {

            if (sqlite3_prepare_v2(database, [SQL UTF8String], -1, &dataset, NULL) == SQLITE_OK) 
            {

                sqlite3_bind_text(dataset, 1, [pin UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_step(dataset);

            }       

            sqlite3_close(database);
        }


    }
于 2012-05-25T13:02:14.107 に答える
0

私は答えを見つけました、誰かがこのような問題を抱えているなら、次のリンクをチェックしてください: iPhone開発-SQLiteの使用に失敗しました

皆様のご支援に感謝します!

于 2012-05-29T08:35:25.653 に答える