-1

NSMutableArrayからデータベースにデータを挿入しようとしているという問題があります。これが私がこれまでに持っているものです:

- (void)insertList:(NSString*) strListName ArrayOfData:(NSMutableArray*) dataArray{
sqlite3 *database = nil;
sqlite3_stmt *addStmt = nil;

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"customlists.sqlite"];
if(sqlite3_open([defaultDBPath UTF8String], &database) == SQLITE_OK)
{
    for (int i = 0; i < dataArray.count; i++)
    {
        PageData *pageDta = [PageData new];
        pageDta = [dataArray objectAtIndex:i];

        if(addStmt == nil) {
            const char *sql = "insert into NewList(ListName, PageName, PageNumber, id) Values(?, ?, ?, ?)";
            if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
                NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
        }

        sqlite3_bind_text(addStmt, 1, [strListName UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(addStmt, 2, [pageDta.strNamebyFilter UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(addStmt, 3, [pageDta.strPageNuber UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_int(addStmt, 4, i);

        if(SQLITE_DONE != sqlite3_step(addStmt))
            NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
        else
            //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
            sqlite3_last_insert_rowid(database);

        //Reset the add statement.
        sqlite3_reset(addStmt);
    }
}
else
{
    NSLog(@"Error while opening database '%s'", sqlite3_errmsg(database));
}
sqlite3_close(database);
}

しかし、この関数を呼び出した後、データベースは空です。この問題の原因と考えられる解決策を見つけるのを手伝ってくれる人はいますか?

4

3 に答える 3

1

主な問題は単純です。アプリのバンドル内のデータベースに書き込もうとしています。これは許可されていません。アプリのバンドルは、実際のデバイスでは読み取り専用です (シミュレーターでは書き込み可能ですが)。適切なことは、アプリの初回実行時にリソース バンドルからアプリのサンドボックスの書き込み可能な領域にデータベースをコピーすることです。その後、データベースのすべての使用はコピーで行われます。

forまた、ループの前にステートメントを準備する方がクリーンです。ループの繰り返しごとに設定されているかどうかを確認し続ける必要はありません。

値を呼び出しますが、sqlite3_last_insert_rowid何もしません。ポイントは何ですか?

ループが完了した後、ステートメントを終了することはありません。あなたはそれをする必要があります。

また、完了時にデータベースを閉じません。

于 2012-12-05T17:43:37.733 に答える
0

この行を変更します:

const char *sql = "insert into NewList(ListName, PageName, PageNumber, id) Values(?, ?, ?, ?)";

に :

NSString *insertSQL = [NSString stringWithFormat: @"NSString stringWithFormat: "INSERT INTO  NewList(ListName, PageName, PageNumber, id) VALUES(\"%@\", \"%@\", \"%@\", \"%@\")" ,strListName, pageDta.strNamebyFilter, pageDta.strPageNuber, addStmt];

const char *sql = [insertSQL UTF8String];
于 2012-12-05T17:20:07.637 に答える
-1

I've rewrite function to:

 if(sqlite3_open([defaultDBPath UTF8String], &database) == SQLITE_OK)
{
    for (int i = 0; i < dataArray.count; i++)
    {
        PageData *pageDta = [PageData new];
        pageDta = [dataArray objectAtIndex:i];

        if(addStmt == nil) {
            const char *sql = [[NSString stringWithFormat:@"INSERT INTO NewList (ListName, PageName, PageNumber) values('%@', '%@', '%@')",strListName,pageDta.strNamebyFilter, pageDta.strPageNuber] UTF8String];

            if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
                NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
        }

        sqlite3_bind_text(addStmt, 1, [strListName UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(addStmt, 2, [pageDta.strNamebyFilter UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(addStmt, 3, [pageDta.strPageNuber UTF8String], -1, SQLITE_TRANSIENT);

        if(SQLITE_DONE != sqlite3_step(addStmt))
            NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));

        //Reset the add statement.
        sqlite3_reset(addStmt);
    }
    sqlite3_finalize(addStmt);
}
else
{
    NSLog(@"Error while opening database '%s'", sqlite3_errmsg(database));
}
sqlite3_close(database);   

but result is the same :(

于 2012-12-06T08:56:17.363 に答える