无法从SQLite数据库更新图像

时间:2018-08-08 16:43:39

标签: android database image sqlite blob

所以,我有使用Sqlite数据库的android应用程序。我有一个Cardview可以显示数据。在表中,我有一个字段,例如name(text),cost(int)和image(BLOB)。我想更新数据。因此,当我更改和更新名称或成本时,图像未更新并返回空白或null。但是当我更改和更新图像时,它成功更新了。

首先,这是我的选择查询,用于显示更新类中的名称,成本和图像

public ModelProduk getnama(int selection){
    SQLiteDatabase db = this.getReadableDatabase();
    String whereclause = KEY_ID_PRODUK + "=?";
    String[] whereargs = new String[]{String.valueOf(selection)};
    Cursor cursor = db.query(
            TABLE_PRODUK,
            null,
            whereclause,
            whereargs,
            null,
            null,
            null
    );
    ModelProduk modelProduk = new ModelProduk();
    if (cursor.moveToFirst()) {

        modelProduk.set_id(Integer.parseInt(cursor.getString(0)));
        modelProduk.set_nama(cursor.getString(1));
        modelProduk.set_harga(Integer.parseInt(cursor.getString(2)));
        modelProduk.set_gambar(cursor.getBlob(3));
    }
    cursor.close();
    db.close();
    return modelProduk;
}

这是我要更新的数据库

public void update(ModelProduk modelProduk) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_NAMA_PRODUK, modelProduk.get_nama());
    values.put(KEY_HARGA_PRODUK, modelProduk.get_harga());
    values.put(KEY_GAMBAR_PRODUK, modelProduk.get_gambar());

    String where = "id=?";
    String[] whereArgs = new String[] {String.valueOf(modelProduk.get_id())};
    // update baris
    db.update(TABLE_PRODUK, values, where, whereArgs);
    db.close();
}

我要更新的Java类

private void init(){

    pilih = getIntent().getIntExtra("id_produk", 0);
    db = new Database(this);
    modelProduk = db.getnama(pilih);

    gambar_produku = (ImageView) findViewById(R.id.pilihgambaru);
    tambahgambaru = (Button) findViewById(R.id.btaddu);
    simpandatau = (Button) findViewById(R.id.btsimpanu);
    deskripsiu = (EditText) findViewById(R.id.etdesku);
    harga_produku = (EditText) findViewById(R.id.ethargau);
    kembaliu = (Button) findViewById(R.id.btkembaliu);

    deskripsiu.setText(modelProduk.get_nama());
    harga_produku.setText(String.valueOf(modelProduk.get_harga()));
    if (modelProduk.get_gambar() != null) {
        gambar_produku.setImageBitmap(bitmap(modelProduk.get_gambar()));
    }
}
public void showFileChooser() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Pilih Gambar"), 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1 && resultCode == RESULT_OK && data != null && data.getData() != null) {


        filePath = data.getData();
        try {
            bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
            gambar_produku.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


public byte[] getImageByte(Bitmap bitmap) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    byte imageInByte[]=null;
    if(bitmap!=null) {
        bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream);
        imageInByte=stream.toByteArray();
    }
    return imageInByte;
}

public Bitmap bitmap (byte[] byteImage){
    byte[] outImage = byteImage;
    Bitmap image ;
    if (outImage != null){
        ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage);
        image = BitmapFactory.decodeStream(imageStream);
    }else {
        image= null;
    }
    return image;
}

我的onclick保存更新

simpandatau.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            modelProduk.set_nama(deskripsiu.getText().toString());
            modelProduk.set_harga(Integer.parseInt(harga_produku.getText().toString()));
            modelProduk.set_gambar(getImageByte(bitmap));
            db.update(modelProduk);
            Toast.makeText(getApplicationContext(), "Data Berhasil Diubah!", Toast.LENGTH_SHORT).show();

        }
    });

请帮助!我已经阅读了许多解决方案,但是对我的问题却并不相同。 谢谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方法。这将尝试在更新之前获取要更新的行。但是,不是返回空白或为null或更新成功,而是返回一个可以为-1、0或1的整数,表示三个可能的结果。

  • 如果该行不存在,则它将返回-1(未更新)。
  • 否则,它将随后将存储的图像与传递的图像进行比较。
    • 如果图像不同,则会将新图像添加到值中,并将值设置为1( IMAGEUPDATED )。
    • 否则,新图像不会添加到值中,并且要返回的值将保持为0( IMAGENOTUPDATED )。通过不将图像添加到值,gambar列将不会包含在 update 方法生成的SQL的SET子句中。

:-

public int update(ModelProduk modelProduk) {

    final int NOTUPDATED = -1;
    final int IMAGENOTUPDATED = 0;
    final int IMAGEUPDATED = 1;

    String where = "id=?";
    String[] whereArgs = new String[] {String.valueOf(modelProduk.get_id())};
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();

    // get the current row from the database (return -1 if it doesn't exist)
    Cursor before_update = db.query(TABLE_PRODUK,null,where,whereArgs,null,null,null);
    if (!before_update.moveToFirst) {
        before_update.close();
        return NOTUPDATED;
    }
    // Default value to return
    rv = IMAGENOTUPDATED;
    // Compare the store image against the new image, if not the same
    //    then include the image in the update
    if (!Arrays.equals(before_update.getBlob(3),modelProduk.get_gambar)) {
        values.put(KEY_GAMBAR_PRODUK, modelProduk.get_gambar());
        rv = IMAGEUPDATED;
    }
    before_update.close();

    values.put(KEY_NAMA_PRODUK, modelProduk.get_nama());
    values.put(KEY_HARGA_PRODUK, modelProduk.get_harga());

    // Update baris checking to see if an update occurred, if not
    //    then set return value to -1 (could be a different status code)
    if (db.update(TABLE_PRODUK, values, where, whereArgs) = 0) {
        rv = NOTUPDATED;
    }
    db.close();
    before_update.close();
    return rv;
}
  • 注意。以上为原则代码,未经测试,因此可能包含错误。

  • 您不妨在更大范围内的其他地方定义NOTUPDATED,IMAGENOTUPDATED和IMAGEUPDATED。