마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

DB에 blob타입으로 update할때 오류입니다.

0 추천
case R.id.nc_pickbtn:
    Intent intent_pick = new Intent(Intent.ACTION_PICK);
    intent_pick.setType(MediaStore.Images.Media.CONTENT_TYPE);
    intent_pick.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent_pick, REQ_CODE_SELECT_IMAGE);

    break;
위는 갤러리로 이동하는 버튼이고요.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Toast.makeText(getBaseContext(), "resultCode : " + requestCode, Toast.LENGTH_SHORT).show();
        try{
          //Uri에서 이미지 이름을 얻어온다.
          //String name_str = getImageNameToUri(data.getData());
          //이미지데이터를 비트맵으로 받아온다.
         Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), data.getData());
            ImageView SelectesNC = (ImageView)findViewById(R.id.SelectedNC);

            //배치해 놓은 ImageView에 set
           SelectesNC.setImageBitmap(bitmap);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            byte[] imageByte = baos.toByteArray();

            Toast.makeText(getApplicationContext(), "DB에?", Toast.LENGTH_SHORT).show();
            <strong>dbHandler.insertImage(imageByte);

            Toast.makeText(getApplicationContext(), "DB에 저장성공", Toast.LENGTH_SHORT).show();
            showImg();
            Log.d("receive", "blob : " + 4);
        }catch (FileNotFoundException e){
            //TODO Auto-generated catch block
            e.printStackTrace();
            Log.d("receive", "blob : " + 1);
        }catch(IOException e){
            //TODO Auto-generated catch block
            e.printStackTrace();
            Log.d("receive", "blob : " + 2);
        }catch(Exception e){
            e.printStackTrace();
            Log.d("receive", "blob : " + 3);
        }
}

private void showImg() {
    dbHandler = new DBHandler(this);

    try{
        // String sql1 = "select ncimg from members where "+ code;
        Cursor mCursor = db.rawQuery("select ncimg from members where "+ code, null);
        byte[] image = mCursor.getBlob(mCursor.getColumnIndex("ncimg"));
        // Bitmap bm = BitmapFactory.decodeByteArray(image, 0, image.length);
        ImageView blobImg = (ImageView) findViewById(R.id.dbImg);

        blobImg.setImageBitmap(BitmapFactory.decodeByteArray(image, 0, image.length));
        mCursor.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}
위 코드에서 SelectesNC.setImageBitmap(bitmap); 여기까진 되는거 같아요.
근데 그 다음부터 insertImage가 오류인거 같은데 잘모르겠네요...
밑에는 dbHandler에 insertImage부분이에요.
public long insertImage(byte[] image){
   db = helper.getWritableDatabase();
   ContentValues values = new ContentValues();

   values.put("ncimg", image);

   Log.w("MypageModify", String.valueOf(image));

   long result = db.update("members", values, null, null);
   return result;
}

현재상황은 이미지를 불러와 SelectdNC에 까지 표시해주는건 되는데, 

그 후에 db에 blob타입으로 저장하고 싶은거죠. 현재 저 테이블에 ncimg는 null이 들어가있고요.

그리고 showImg에서 dbImg에 db에 저장된 이미지를 다시 불러와서 확인해 주는걸 하고싶은겁니다.ㅠㅠ

로그부분도 올려드리고 싶은데 초과라고 못쓰네요ㅠㅠ

도와주세요.ㅠㅠ

sean111 (1,220 포인트) 님이 2015년 9월 7일 질문
sean111님이 2015년 9월 7일 수정
로그부분입니다.

09-07 10:31:00.660  11572-11572/org.androidtown.lbs.map D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
09-07 10:31:01.595  11572-11572/org.androidtown.lbs.map W/IInputConnectionWrapper﹕ showStatusIcon on inactive InputConnection
09-07 10:31:07.570  11572-11572/org.androidtown.lbs.map W/System.err﹕ java.lang.NullPointerException: Attempt to invoke virtual method 'long org.androidtown.lbs.map.DBHandler.insertImage(byte[])' on a null object reference
09-07 10:31:07.570  11572-11572/org.androidtown.lbs.map W/System.err﹕ at org.androidtown.lbs.map.MypageModify.onActivityResult(MypageModify.java:140)
09-07 10:31:07.570  11572-11572/org.androidtown.lbs.map W/System.err﹕ at android.app.Activity.dispatchActivityResult(Activity.java:6549)
09-07 10:31:07.570  11572-11572/org.androidtown.lbs.map W/System.err﹕ at android.app.ActivityThread.deliverResults(ActivityThread.java:4086)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map W/System.err﹕ at android.app.ActivityThread.handleSendResult(ActivityThread.java:4133)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map W/System.err﹕ at android.app.ActivityThread.access$1400(ActivityThread.java:179)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1511)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map W/System.err﹕ at android.os.Looper.loop(Looper.java:145)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5974)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
09-07 10:31:07.575  11572-11572/org.androidtown.lbs.map D/receive﹕ blob : 3

1개의 답변

0 추천
 
채택된 답변
<strong>dbHandler.insertImage(imageByte); 여기서 imageByte 이것이  null이라고
(Attempt to invoke virtual method 'long org.androidtown.lbs.map.DBHandler.insertImage(byte[])' on a null object reference)
따라서 imageByte가 왜 null이되는지 찾아보셔야 할 것 같습니다.
컴러기 (22,230 포인트) 님이 2015년 9월 7일 답변
sean111님이 2015년 9월 9일 채택됨
제가 초보라서 이걸 몇번을 봐도 왜 null값이라고 하는지 모르겠습니다..ㅠㅠ
그냥 보기엔 bitmap으로 출력했던 값을 그대로 가져와 저장하라고 한것이라 생각되는데요 ...
로그만 봐서는 그게 왜 널이 되는지는 모르겠어요.
SelectesNC.setImageBitmap(bitmap);
에서 정상 동작한 bitmap이라면
byte[] imageByte = baos.toByteArray();
에서 잘못되는 것이겠죠.
해당 현상이 왜 생기는지는 직접 살피셔야 하는 부분이라.
간단한 경우로 한가지 들자면 메모리 부족에서 올수도 있습니다만... 정확한 원인은 차분히 로그도 살펴보시고 중단점도 걸어보셔서 왜생기는지 찾으셔야 할듯 합니다.
...