2012-03-16 4 views
0

다음 코드 나는 DB에 이미지를 저장하기 위해 쓰고 있습니다.SQLite에 이미지 저장

NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO slamDetailsTable (name, gender, phone,email,movie,abt,dob,smiley1,smily2,smily3,image) VALUES (\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",?)", contact.name, contact.gender, contact.phone,contact.email,contact.movies,contact.abtMe,contact.dob,contact.smiley1,contact.smiley2,contact.smiley3]; 
     NSLog(@"query %@",insertSQL); 
     const char *insert_stmt = [insertSQL UTF8String]; 

     sqlite3_prepare_v2(database, insert_stmt, -1, &statement, NULL); 
     sqlite3_bind_blob(statement, 1, [contact.imageData bytes], [contact.imageData length], NULL); 
     if (sqlite3_step(statement) == SQLITE_DONE) 
     { 
      NSLog(@"Row added"); 
     } 

     else { 
      NSLog(@"Failed to add row"); 
     } 

다음의 라인은 이미지를 얻기 위해 추가 중입니다.

NSData *imageDataFromDb = [[NSData alloc]initWithBytes:sqlite3_column_blob(statement, 11) length:sqlite3_column_int(statement, 11)]; 

그러나. 0 바이트를 나타내는 imageDataFromDb.

답변

2

블롭의 길이를 얻으려면 sqlite3_column_int()을 사용하지 마십시오. 올바른 사용 호출은 sqlite3_column_bytes()입니다. 결과가 BLOB 또는 UTF-8 문자열이 BLOB 또는 문자열의 바이트 다음 sqlite3_column_bytes()으로 돌아 간다 수를 경우

.

+0

Shoud 나는 두 경우 모두 qlite3_column_bytes()를 사용합니까? – Shreedhar

+0

@Shreedhar 테스트없이 볼 수있는 한 당신의 글은 괜찮아 보입니다. 읽는 중이라면 sqlite3_column_int를 사용하면 길이가 잘못 될 것입니다 (blob을 정수로 변환하려고 시도 할 것입니다. 반환 할 것이다) –

+0

0 바이트를 보여주는 정지 이미지 dataFromDb. – Shreedhar

0

당신이 뭔가 구체적으로 할 것을 요구했지만 나는 이미지를 장치에 저장하고 그 이미지의 이름이나 위치를 데이터베이스에 저장하는 것이 훨씬 더 효율적인 방법임을 발견했습니다. . SQLite 데이터베이스에 큰 이미지를 저장하는 것은 매우 시간이 많이 걸릴 수 있습니다.

+0

그런 종류의 예를 들어 줄 수 있습니까? – Shreedhar

+0

지금 Google에 파일을 장치에 저장 한 다음 db에 해당 파일의 문자열을 저장하는 방법은 없습니다. 이것의 주된 문제점은 파일이 실제로 존재하는지 확인하는 것입니다. 이미지를 애플리케이션 번들에 포함 시키거나 앱 자체 내에서 다운로드 할 수 있습니다. –