2013-10-08 2 views
0

이미지가 포함 된 계정에 대한 정보를 저장하는 앱이 있습니다. 모든 것이 훌륭합니다 : 테이블이 만들어지고 데이터를 저장할 수 있지만 이미지가 아닙니다. 이미지가 저장되지 않았거나 db에서 검색 할 수없는 경우 이해할 수 없습니다. 내 코드 :sqlite3 iphone에서 이미지 데이터 삽입 및 읽기

데이터베이스 테이블 :

static const char *accountsTable = "CREATE TABLE IF NOT EXISTS tbl_accounts (unique_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, provider_id INTEGER, login TEXT, password TEXT, threshold INTEGER, is_need_push INTEGER, comment TEXT, image BLOB)"; 

내 삽입 방법 :

-(BOOL) createAccountWithAccountData:(AccountsData *) accountData 
{ 
    NSInteger pushNotifications = accountData.isNeedPushNotifications ? 1 : 0; 
    const char *dbPath = [dataBasePath UTF8String]; 
    if (sqlite3_open(dbPath, &database) == SQLITE_OK) { 
     NSString *insertSqlStatement = [NSString stringWithFormat: @"INSERT INTO tbl_accounts (provider_id, login, password, threshold, is_need_push, comment, image) values ('%d', '%@', '%@', '%d', '%d', '%@', '?')", accountData.providerId, accountData.logIn, accountData.password, accountData.threshold, pushNotifications, accountData.comment]; 

     const char *insertStmt = [insertSqlStatement UTF8String]; 

     if (sqlite3_prepare_v2(database, insertStmt, -1, &sqlStatement, NULL) == SQLITE_OK) { 
      if (accountData.image != nil) { 
       NSLog(@"Image not null"); 
       NSData *imageData = UIImageJPEGRepresentation(accountData.image, 1.0); 
       sqlite3_bind_blob(sqlStatement, 7, [imageData bytes], [imageData length], nil); 
      } else { 
       NSLog(@"image is nil"); 
      } 
      if (sqlite3_step(sqlStatement) == SQLITE_DONE) 
      { 
       NSLog(@"Successfully created account data"); 
       sqlite3_reset(sqlStatement); 
       sqlite3_close(database); 
       return YES; 
      } else { 
       NSLog(@"Unable to create account data"); 
       sqlite3_reset(sqlStatement); 
       sqlite3_close(database); 
       return NO; 
      } 
     } 
    } 
    return NO; 
} 

내 GET 모든 계정 방법 :

-(NSArray *) getAllAccounts 
{ 
    const char *dbPath = [dataBasePath UTF8String]; 
    NSMutableArray *allAccounts = [[NSMutableArray alloc] init]; 
    if (sqlite3_open(dbPath, &database) == SQLITE_OK) { 
     NSLog(@"DB Opened"); 
     NSString *findSqlStatement = [NSString stringWithFormat: @"SELECT * FROM tbl_accounts"]; 
     const char *findStmt = [findSqlStatement UTF8String]; 
     if (sqlite3_prepare_v2(database, findStmt, -1, &sqlStatement, NULL) == SQLITE_OK) 
     { 
      NSLog(@"statement was prepared"); 
      while (sqlite3_step(sqlStatement) == SQLITE_ROW) 
      { 
       NSLog(@"Into the while loop"); 
       NSInteger uniqueId = [[NSString stringWithUTF8String:(const char *) sqlite3_column_text(sqlStatement, 0)] integerValue]; 
       NSInteger providerId = [[NSString stringWithUTF8String:(const char *) sqlite3_column_text(sqlStatement, 1)] integerValue]; 
       NSString *logIn = [NSString stringWithUTF8String: 
            (const char *) sqlite3_column_text(sqlStatement, 2)]; 
       NSString *password = [NSString stringWithUTF8String: 
            (const char *) sqlite3_column_text(sqlStatement, 3)]; 
       NSInteger threshold = [[NSString stringWithUTF8String:(const char *) sqlite3_column_text(sqlStatement, 4)] integerValue]; 

       NSInteger pushNotif = [[NSString stringWithUTF8String:(const char *) sqlite3_column_text(sqlStatement, 5)] integerValue]; 

       NSString *comment = [NSString stringWithUTF8String: 
             (const char *) sqlite3_column_text(sqlStatement, 6)]; 

       BOOL isNeedNotif = [self convertNSInteger:pushNotif]; 

       int length = sqlite3_column_bytes(sqlStatement, 7); 
       NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(sqlStatement, 7) length:length]; 

       NSLog(@"itemLogin: %@", logIn); 
       NSLog(@"password : %@", password); 
       NSLog(@"data is: %@", data); 
       NSLog(@"comment is: %@", comment); 
       NSLog(@"isNeedNotif: %hhd", isNeedNotif); 

       UIImage *imageFromDb = nil; 
       if (data != nil) 
        imageFromDb = [[UIImage alloc] initWithData:data]; 
       else 
        NSLog(@"No image"); 

       if (imageFromDb) { 
        NSLog(@"Image"); 
       } else { 
        NSLog(@"NoImage"); 
       } 

       AccountsData *item = [[AccountsData alloc] initWithProviderId:providerId logIn:logIn password:password threshold:threshold isNeedPushNotifications:isNeedNotif comment:comment image:imageFromDb]; 
       item.unique_id = uniqueId; 

       [allAccounts addObject:item]; 
       NSLog(@"Item added to array"); 
       NSLog(@"Array count: %d", [allAccounts count]); 
      } 
     } 
     sqlite3_reset(sqlStatement); 
     sqlite3_close(database); 
    } 

    return allAccounts; 
} 

나는 에뮬레이터를 테스트했습니다 이미지 데이터는 (NSDATA, NSLog에 따라) : 데이터 : < 3f>

제발, 도와주세요!

+3

어쩌면 이미지를 장치에 저장하고이 이미지의 경로를 데이터베이스에 저장해야합니까? – Edelweiss

+0

그래, 아마도 누가 더 잘 알지. 그러나 문제는 이미지를 저장하고 검색 할 수 있지만이를 수행 할 수 없다는 것입니다. 그게 바로 내가 알기 원하는 것입니다. – PAcan

+0

정말 도움이되지는 않습니다. 항상 위의 방법을 사용했습니다. 나는 당신이 할 수있는 경우에 그것을 시도하는 것이 좋습니다! :-) – Edelweiss

답변

2
INSERT INTO tbl_accounts (..., image) values (..., '?') 

당신은 하나의 문자 ? 구성된 문자열을 삽입한다.

매개 변수 마커는 인용해서는 안 :

INSERT INTO tbl_accounts (..., image) values (..., ?) 

또한, sqlite3_bind_blob의 두 번째 매개 변수는 매개 변수 수 있으며, 문은 하나 개의 매개 변수가 있습니다; 7이 아니라 1이어야합니다.

또한 sqlite3_reset은 문을 다시 사용하려는 경우에만 필요하지만 그렇지 않으면 무해합니다. 잊지 말아야 할 것은 진술서 작성이 완료되고 데이터베이스를 닫기 전에 sqlite3_finalize으로 전화하는 것입니다. 이 코드에서 sqlite3_resetsqlite3_finalize으로 바꿉니다.

+0

인용하지 않으면 테이블에 아무것도 넣지 않습니다. 내 기록에 따르면 데이터는 다음과 같습니다 : <> – PAcan

+0

다른 버그가 있으면 업데이트되었습니다. 내가 그들 모두를 찾았다 고 보장 할 수는 없습니다. –