Как сохранить и получить изображение в / из базы данных SQLite Android - PullRequest
0 голосов
/ 29 июня 2019

Я нахожусь внутри фрагмента, и у меня есть CircleImageView, для которого я установил изображение в xml по умолчанию, используя android:src="@drawable/default_profile_image". Пользователь может решить, загружать ли другое изображение, и я делаю это, запустив намерение, которое открывает галерею, и в onActivityResult() я загружаю изображение следующим образом:

if(requestCode==0 && resultCode == Activity.RESULT_OK) {
            Uri path = data.getData();
            Bitmap photo = null;
            try {
                photo = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), path);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if(photo != null)
                mProfilePhoto.setImageBitmap(photo);
        }

Теперь, независимо от того, загрузил ли пользователь другое изображение или оставил изображение по умолчанию, я хотел бы сохранить его в базе данных, а затем взять его. У меня уже есть метод, который правильно берет имя из базы данных.

private void getUserInformation(){
        Cursor data = databaseHelper.getUserInformation();

        if(data.moveToFirst()) {
            //this crash 
            Bitmap bitmap = BitmapFactory.decodeByteArray(data.getBlob(2), 0, data.getBlob(2).length);
            if(bitmap != null)
                mProfilePhoto.setImageBitmap(bitmap);*/

            mProfileName = data.getString(1);

        }
        data.close();
    }

Это то, что у меня на данный момент не работает

метод onclick внутри фрагмента

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.saveProfileButton:
            //need to pass a bitmap insted of null
            addUserInformation(name,null);
            break;
        case R.id.profile_photo:
            Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            try {
                startActivityForResult(
                        Intent.createChooser(i, "Select Picture"), 0);
            }catch (ActivityNotFoundException ex){
                ex.printStackTrace();
            }
            break;
    }

}
private void addUserInformation(String username, Bitmap profile_pic){
    boolean b = databaseHelper.addUserInformation(username, profile_pic);
    if(b) {
        toastMessage("Update Success");
    }
    else
        toastMessage("Update Failed");
}

DatabaseHelper класс

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "userinfo";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_NAME1 = "USER_INFORMATION"; 

    public DatabaseHelper(Context context) {
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table "+TABLE_NAME1+" (ID INTEGER PRIMARY KEY AUTOINCREMENT, USERNAME TEXT, PICTURE BLOB)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME1);
        onCreate(db);
    }

    public boolean addUserInformation(String username, Bitmap picture){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("USERNAME", username);
        byte[] data = getBitmapAsByteArray(picture);
        values.put("PICTURE", data);
        long id = db.insert(TABLE_NAME1, null, values);
        db.close();
        if(id == -1)
            return false;
        else
            return true;

    }

    private static byte[] getBitmapAsByteArray(Bitmap bitmap) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
        return outputStream.toByteArray();
    }
}

1 Ответ

1 голос
/ 29 июня 2019

Измените свой метод:

private void getUserInformation(){
        Cursor data = databaseHelper.getUserInformation();

        if(data.moveToFirst()) {
            byte[] btyeArray = data.getBlob(2);
                if(btyeArray != null) {
                  Bitmap bitmap = BitmapFactory.decodeByteArray(btyeArray , 0, btyeArray .length);
                  if(bitmap != null) {
                      mProfilePhoto.setImageBitmap(bitmap);
                      photo = bitmap;
                    }else
                      mProfilePhoto.setImageResource(R.drawable.defaultImage); // set your default Image here
                 } else {
                   mProfilePhoto.setImageResource(R.drawable.defaultImage); // set your default Image here
                 }
            mProfileName = data.getString(1);

        }
        data.close();
    }

в onActivityResult Растровое изображение photo определяет его как глобальную переменную. и при вызове addUserInformation отправить photo переменную.

  case R.id.saveProfileButton:
            //need to pass a bitmap insted of null
            addUserInformation(name, photo);

Измените свой DatabaseHelper метод

public boolean addUserInformation(String username, Bitmap picture){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("USERNAME", username);
        if(picture != null) {
          byte[] data = getBitmapAsByteArray(picture);
          values.put("PICTURE", data);
        }
        long id = db.insert(TABLE_NAME1, null, values);
        db.close();
        if(id == -1)
            return false;
        else
            return true;

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...