2011-03-27 7 views
1

그림을 데이터베이스에 BLOB으로 저장하려고 시도했지만 데이터베이스에 제대로 저장되지 않았습니다.그림이 데이터베이스에 올바르게 저장되지 않았습니다 (BLOB).

전달되는 바이트 []는 정확하고 4300 자이며 데이터베이스에는 12 자만 있습니다. DB에 저장되어있는 무엇 :

public boolean SQL_INSERT_PICTURE(PictureDatatype type) { 
    try{ 
     this.db = openHelper.getWritableDatabase(); 
     Log.d(TAG, "Insert picture"); 
     System.out.println("insert picture"); 
     db.execSQL("DELETE FROM picture " + 
       "where " + LinkPic + " = '" + type.getLink() + "'"); 
     db.execSQL("INSERT OR REPLACE INTO picture " + 
       "(" + NamePic + ", " + LinkPic + ", " + PicturePic + ") " + 
       "VALUES ('" + type.getName() + "', '" + type.getLink() +"', '" + 
       type.getPicture() +"')"); 

     System.out.println("size of the picture (bytearray): " + type.getPicture().length); 
     System.out.println("the picture: " + type.getPicture()); 
     System.out.println("insert complete"); 
     db.close(); 
     return true; 
    } 
     catch(SQLException s){ 
      System.out.println("Insert failed"); 
      db.close(); 
      return false; 
     } 
} 

내 질문은 왜 안 올바른 바이트 [] 어떻게 DB 나에 저장되어 있습니다 : 여기 43e7be68

@ [B 내 SQL_INSERT의 코드 내가 할 수 있을까? 자세한 정보가 필요하거나 pls 코드가 필요하면 알려주십시오. 당신이 문자열로 바이트 [] 배열을 전달하려는 것 같습니다

들으 kirbby

+2

그냥 측면 덧글. 당신은 데이터베이스에 이미지를 저장하지 말아야한다. 왜냐하면 바이너리를 미디어 유형으로 변환하는 것과 같은 작업을 CPU가 더 집중적으로 수행해야하기 때문이다. 그림을 데이터베이스에 저장하는 것이 왜 안되는가? – ForeverNights

+0

사이드 노트 : 그림을 삭제할 필요가 없다. 어쨌든 INSERT OR REPLACE를 수행하는 경우 먼저 ... – Martijn

+0

또한 문자열 연결을 사용하여 SQL 문을 어셈블하는 것은 SQL injection exploits에 대한 확실한 경로입니다. 바운드 인수를 사용하는 execSQL() 버전을 살펴보십시오. db.execSQL ("LinkPic =?", new Object [] {type.getLink()});'에서 DELETE FROM picture를 할 수 있습니다. 더 빠르고 읽기 쉽고 SQL 주입 문제로부터 완전히 격리됩니다. –

답변

1

사용이 코드를

private byte[] getBitmapAsByteArray(Bitmap bitmap) { 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
     // Middle value is quality, but PNG is lossless, so it's ignored. 
     bitmap.compress(CompressFormat.PNG, 0, outputStream); 
     return outputStream.toByteArray(); 
    } 

또는

: 그는 BLOB로 저장 될 수 BYTEARRAY
private byte[] getBitmapAsByteArray(Bitmap bitmap) { 
     final int width = bitmap.getWidth(); 
     final int height = bitmap.getHeight(); 
     ByteBuffer byteBuffer = ByteBuffer.allocate(width * height * 4); 

     bitmap.copyPixelsToBuffer(byteBuffer); 
     return byteBuffer.array(); 
    } 

첫 번째 옵션은 항상 작동해야합니다. 두 번째 옵션은 32 비트/픽셀 (ARGB_8888 형식)이므로 4 바이트로 가정합니다. 비트 맵의 ​​형식이 다른 형식 (예 : 565) 인 경우 약간의 수정이 필요합니다.

데이터베이스에서 이미지 데이터를 읽을

이처럼 수행

public Bitmap loadIcon(long iconId) { 
     // Prepare the cursor to read from database.... 
     byte[] bitmapData = cursor.getBlob(cursor.getColumnIndex(Columns.Icons.DATA)); 

     return BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length); 
    } 

은 데이터베이스가 당신이 당신의 "테이블을 만들고"SQL 문을 실행 BLOB로 정의되어 있는지 확인합니다.

관련 문제