2
-(void)insertDataToFavourites:(int)pageid :(NSString *)description
{
    sqlite3_stmt *insertStatement = nil;
    NSString *sql;
    int returnvalue;

    sql = [NSString stringWithFormat:@"insert into AddFavorite (Id,Description) VALUES (?,?)"];

    returnvalue = sqlite3_prepare_v2(database, [sql UTF8String], -1, &insertStatement, NULL);

    if (returnvalue == 1){
        NSAssert1 (0,@"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
    }
    sqlite3_bind_text(insertStatement, 2,[[tempDict objectForKey:@"pageid"] UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(insertStatement, 3,[[tempDict objectForKey:@"desc"] UTF8String], -1, SQLITE_TRANSIENT);
    if (SQLITE_DONE != sqlite3_step(insertStatement)){
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    }
    else{
        sqlite3_reset(insertStatement);
    }

    sqlite3_finalize(insertStatement);

    if(sqlite3_exec(database, [sql UTF8String], NULL, NULL, NULL) != SQLITE_DONE ){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert!" message:@"Data saved Successfully." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alert show];
        [alert release];
    }

    else{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert!" message:@"Data insertion error." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alert show];
        [alert release];
    }

}

上記のコードは、Sqliteデータベーステーブルにデータを挿入するために行っています。これは、アラートデータが正常に保存されたことを示しています。 お気に入りリストにデータを挿入するとき。

-(void)getFavoriteList
{

    if([ArrFav count] > 0)
        [ArrFav removeAllObjects];

    ArrFav = [[NSMutableArray alloc] init];

    sqlite3_stmt *selectStatement=nil;  
    NSString *sql;
    int returnvalue;

    sql=[NSString stringWithFormat:@"SELECT Description FROM AddFavorite"];

    returnvalue = sqlite3_prepare_v2(database, [sql UTF8String], -1, &selectStatement, NULL);

    if(returnvalue==1)
    {
        NSAssert1(0, @"Error: failed to select the database with message '%s'.", sqlite3_errmsg(database));
    }

    NSMutableDictionary *dict;
    NSString *str;
    if(returnvalue == SQLITE_OK)
    {                       
        while(sqlite3_step(selectStatement) == SQLITE_ROW)
        {   
            dict = [[NSMutableDictionary alloc] init];
            [dict setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement,1)] forKey:@"Description"];

            [ArrFav addObject:[dict objectForKey:@"Description"]];
            NSLog(@"Favorite data is:--> %@",ArrFav);
        }       
    }
}

これは、sqliteデータベーステーブルからデータを選択するためのコードです。次の行で[dictsetObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement、1)] forKey:@ "Description"]; アプリケーションがクラッシュします。

誰かが私に問題について提案できますか、なぜこの問題が発生するのか、そしてこれの解決策は何ですか?

4

3 に答える 3

1

辞書のキーにnil値を設定しようとしていると思います。これは、SELECTステートメントから結果が得られないことを意味します。Mozilla sqliteエディターを使用してDBの内容を確認し、取得しようとしている値がDBに存在するかどうかを確認してください。

于 2012-08-06T06:35:58.243 に答える
0

注意すべきいくつかの事柄:

1)

DBの読み取り専用バージョンを使用していないことを確認してください。これは、アプリケーションライブラリのドキュメントフォルダではなく、プロジェクトに追加されたばかりのデータベースファイルになります(/ library / Application Support / iphoneSimulator/バージョン/applications/ app id / Documents /)ファイルをプロジェクトフォルダに追加しますあなたが書くことを許可しません。

2)

sql = [NSString stringWithFormat:@"insert into AddFavorite (Id,Description) VALUES (?,?)"];

としてより良いかもしれません(値の周りの''に注意してください)

sql = [NSString stringWithFormat:@"insert into AddFavorite (Id,Description) VALUES (\'%@\',\'%@\')",[tempDict objectForKey:@"pageid"], [tempDict objectForKey:@"desc"]];

3)

sqlite3_bind_text(insertStatement, 2,[[tempDict objectForKey:@"pageid"] UTF8String], -1, SQLITE_TRANSIENT);

sqlite3_bind_text(insertStatement, 3,[[tempDict objectForKey:@"desc"] UTF8String], -1, SQLITE_TRANSIENT);

Mehulが言ったように、2と3ではなく1と2に挿入する必要があります。

sqlite3_bind_text(insertStatement, 1,[[tempDict objectForKey:@"pageid"] UTF8String], -1, SQLITE_TRANSIENT);

sqlite3_bind_text(insertStatement, 2,[[tempDict objectForKey:@"desc"] UTF8String], -1, SQLITE_TRANSIENT);

4)

このバグの良い点は、データベースから返されるnull文字列をチェックし、エラーを適切に処理する必要があるという重要な点を強調していることです。

于 2012-08-06T07:57:14.437 に答える
0

こんな感じだと思います。

sqlite3_bind_text(insertStatement, 1,[[tempDict objectForKey:@"pageid"] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(insertStatement, 2,[[tempDict objectForKey:@"desc"] UTF8String], -1, SQLITE_TRANSIENT);

DBからデータを選択するときは、これを使用する必要があります。

[dict setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement,0)] forKey:@"Description"]
于 2012-08-06T06:36:05.963 に答える