在Android中将照片插入数据库时​​出现空指针异常

时间:2014-12-29 19:46:15

标签: java android sqlite bitmap

我是android的初学者我正在制作一个应用程序在sqlite数据库中插入数据,并且我在将记录添加到数据库时有一个空指针异常

此代码从imageview获取图片并将其转换为位图然后转换为字节以保存它 任何建议,以避免这种例外 这是代码

            imageView1.setDrawingCacheEnabled(true);
            imageView1.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));


            imageView1.layout(0, 0, imageView1.getMeasuredWidth(),  imageView1.getMeasuredHeight()); 

             imageView1.buildDrawingCache(true);

             Bitmap b = Bitmap.createBitmap(imageView1.getDrawingCache());
             imageView1.setDrawingCacheEnabled(false);

            save_picture=loginDataBaseAdapter.getBytes(b);


            loginDataBaseAdapter.insertEntry(userName, password, save_picture);
            Toast.makeText(getApplicationContext(), "Record created  ", Toast.LENGTH_LONG).show();`}

有将位图转换为字节

的方法
// convert from bitmap to byte array
     public  byte[] getBytes(Bitmap bitmap) {
      ByteArrayOutputStream stream = new ByteArrayOutputStream();
      bitmap.compress(CompressFormat.PNG, 0, stream);
      return stream.toByteArray();
     }

并且有插入方法

public void insertEntry(String userName,String password , byte[] photo  )
    {
       ContentValues newValues = new ContentValues();
        // Assign values for each row.
        newValues.put("USERNAME", userName);
        newValues.put("PASSWORD",password);
        newValues.put("Photo", photo);

        // Insert the row into your table
        db.insert("LOGIN", null, newValues);

    }

并且有数据库创建

static final String DATABASE_CREATE = "create table "+"LOGIN"+
                                 "( " +"ID"+" integer primary key autoincrement,"+ "USERNAME  text,PASSWORD text, Photo blob not null); ";

谢谢

3 个答案:

答案 0 :(得分:0)

使用此类将位图转换为byteArray:

public class Utility {
// convert from bitmap to byte array
public static byte[] getBytes(Bitmap bitmap) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.PNG, 0, stream);
    return stream.toByteArray();
}

// convert from byte array to bitmap
public static Bitmap getPhoto(byte[] image) {
    return BitmapFactory.decodeByteArray(image, 0, image.length);
}

} 并进入InsertEntry方法:

newValues.put(G_PHOTO, Utility.getBytes(image));

答案 1 :(得分:0)

尝试将位图保存在base64表单字符串中,然后将其插入数据库。 因此,您的getBytes方法将是getBase64Picture,并且将类似于:

 public  String getBase64StrFromPicture(Bitmap bitmap) {
   ByteArrayOutputStream stream = new ByteArrayOutputStream();
   bitmap.compress(CompressFormat.PNG, 0, stream);
   String imageEncoded = Base64.encodeToString(stream.toByteArray(), Base64.DEFAULT);
   return imageEncoded;
 }

然后,要检索您的图片,在查询之后您可以使用相反的步骤,也就是将您的字符串图片转换为位图!

 public Bitmap getBitmapFromBase64Str(){
   byte[] decodedString = Base64.decode(encodedImage, Base64.URL_SAFE);
   Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
   return decodedByte;
 }

答案 2 :(得分:0)

由于getDrawingCache总是返回null

,因此空指针异常

为避免此错误,我使用此方法

  public static Bitmap loadBitmapFromView(View v) {
          Bitmap bi = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);                
          Canvas c = new Canvas(bi);
          v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
          v.draw(c);
          return bi;
     }

感谢您的指导:)