5

im Xcode 4.6でsqliteを使用してデータベースにIMAGEを挿入する作業をしているときに、テキストフィールドとuiimageview(動的に生成されたバーコード画像を持つ)を挿入したかっただけです。

残念ながら、「エラーは次のとおりです:メモリ不足です」というメッセージが表示されます

聞いてください私が使用しているコードです、plzは私の間違いがどこにあるかを私に知らせてください&詳細については私に知らせてください

*1.データベースの作成*

-(void)createoropendb {

    NSArray *path =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docpath =[path objectAtIndex:0];

    dbpathstring =[docpath stringByAppendingPathComponent:@"DataBase.db"];
    char *error;

    NSFileManager *filemanager =[NSFileManager defaultManager];

    if (![filemanager fileExistsAtPath:dbpathstring])
    {
        const char *dbpath =[dbpathstring UTF8String];

        if (sqlite3_open(dbpath, &barcodeDB) == SQLITE_OK)
        {
            const char *sql_start ="CREATE TABLE IF NOT EXISTS DBTABLE1(NAME TEXT UNIQUE,IMAGEURL BLOB)";
             NSLog(@"db created");
            sqlite3_exec(barcodeDB, sql_start,NULL,NULL, &error);
            sqlite3_close(barcodeDB);

        }
    }
}

*2.データを挿入するためのボタン*

- (IBAction)savedata:(id)sender  {
    UIImage *image =imageView.image;
    NSData *imageData=UIImagePNGRepresentation(image);   
    [self SaveImagesToSql: imageData.bytes:Uimagetext.text];  
}

*3.データを挿入する方法*

- (void) SaveImagesToSql: (NSData*) imgData :(NSString*) mainUrl {   

    const char* sqliteQuery = "INSERT INTO DBTABLE1(NAME,IMAGEURL) VALUES (?, ?)";
    sqlite3_stmt* statement;

    if( sqlite3_prepare_v2(barcodeDB, sqliteQuery, -1, &statement, NULL) == SQLITE_OK )
    {
        sqlite3_bind_text(statement, 1,[mainUrl UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_blob(statement, 2,[imgData bytes],[imgData length], SQLITE_TRANSIENT);

        sqlite3_step(statement);

        NSLog( @"Saved image successfully" );

    }
    else
    {


      NSLog( @"SaveBody: Failed from sqlite3_prepare_v2. Error is:  %s",sqlite3_errmsg(barcodeDB) );
    }
    // Finalize and close database.
    sqlite3_finalize(statement);
}
4

1 に答える 1

1

戻りコード(ではないSQLITE_OK)は間違いなく戻りSQLITE_MISUSEます。これは、まだ開いていないデータベースを使用しようとしていることを意味します。データベースが存在しない場合は作成して開いていますが、データベースが存在する場合は開いていませcreateoropendbん(データベースが存在していても、作成後に閉じています)。

結論として、を呼び出したときにデータベースが開かれていない場合sqlite3_prepare、その関数はを返します。をSQLITE_MISUSE呼び出すとsqlite3_errmsg、誤解を招く「メモリ不足」というテキストメッセージが返されます。

于 2013-03-27T04:06:51.683 に答える