Как получить изображение, щелкнув элемент представления сетки, а затем сохранить его в базе данных SQLite

В My App пользователь создает новую учетную запись, вводя некоторые учетные данные в диалоговом окне. Внутри есть GridView диалоговое окно с разными значками для учетных записей. Пользователь может выбрать любой значок для своей учетной записи при создании учетной записи. Проблема в том, что изображение не отображается в виде списка и в браузере БД для SQLite. Я не знаю, что мне делать, даже после долгих поисков. Вот моя попытка:

Массив Int, содержащий изображения: (многие изображения имеют формат .svg, а другие — .png)

int[] icons = {R.drawable.personalbusaccount, R.drawable.ic_accountant, R.drawable.ic_bank_account,
        R.drawable.multipleaccount, R.drawable.ic_accounting, R.drawable.ic_consultant, R.drawable.choice,
        R.drawable.ic_businesswoman, R.drawable.ic_man, R.drawable.ic_login};

После нажатия кнопки:

 @Override
        public void onClick(View view) {
            AlertDialog.Builder builder = new AlertDialog.Builder(AccountsActivity.this);
            LayoutInflater inflater = getLayoutInflater();
            View v = inflater.inflate(R.layout.new_account_dialog, null);
            final EditText editText = v.findViewById(R.id.et_accname);

            final GridView gv = v.findViewById(R.id.accicon_grid_view);
            NewAccountGAdapter newAccountGAdapter = new NewAccountGAdapter(AccountsActivity.this, icons);
            gv.setAdapter(newAccountGAdapter);

            gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    for (int i = 0; i < gv.getChildCount(); i++) {
                        if(position == i ){
                            gv.getChildAt(i).setBackgroundColor(getResources().getColor(R.color.colorLightGrey));
                            accountIcon = inttoByteArray(icons[position]);
                        }else{
                            gv.getChildAt(i).setBackgroundColor(Color.TRANSPARENT);
                        }
                    }
                }
            });

            builder.setPositiveButton("Create", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    accountName = editText.getText().toString();

                    boolean dataAdded = databaseHelper.addAccount(accountIcon, accountName, "0 Rs");
                    if (dataAdded){
                        Toast.makeText(AccountsActivity.this, "Account Created !", Toast.LENGTH_SHORT).show();
                        populateListView();
                    }else {
                        Toast.makeText(AccountsActivity.this, "Account not Created ", Toast.LENGTH_SHORT).show();
                    }

                }
            });

Методы: inttoByteArray():

private byte[] inttoByteArray(final int i){
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        DataOutputStream dataOutputStream = new DataOutputStream(bos);
    try {
        dataOutputStream.writeInt(i);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        dataOutputStream.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bos.toByteArray();
}

В getView() моего пользовательского BaseAdapter :

View view = LayoutInflater.from(context).inflate(R.layout.accounts_list_items, parent, false);
    ImageView imageView = view.findViewById(R.id.acc_icon);
    TextView textViewName = view.findViewById(R.id.tv_accName);
    TextView textViewBlnc = view.findViewById(R.id.tv_accBlnc);

    byte[] icons = accountsModelList.get(position).getIcon();

    Bitmap bm = BitmapFactory.decodeByteArray(icons, 0, icons.length);
    imageView.setImageBitmap(bm);
    textViewName.setText(accountsModelList.get(position).getAccName());
    textViewBlnc.setText(accountsModelList.get(position).getAccBlnc());

Класс DatabaseHelper:

private static final String TABLE_NAME = "accounts";
private static final String TABLE_COL1 = "acc_id";
private static final String TABLE_COL2 = "acc_icon";
private static final String TABLE_COL3 = "acc_name";
private static final String TABLE_COL4 = "acc_blnc";

 public void onCreate(SQLiteDatabase db) {
    String accountsTable = "CREATE TABLE " + TABLE_NAME + " (" + TABLE_COL1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            TABLE_COL2 + " BLOB, " + TABLE_COL3 + " VARCHAR(300), " + TABLE_COL4 + " VARCHAR(500))";

db.execSQL(accountsTable);
}

public boolean addAccount(byte[] icon, String acName, String acBlnc){
    SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(TABLE_COL2, icon);
        contentValues.put(TABLE_COL3, acName);
        contentValues.put(TABLE_COL4, acBlnc);
        return db.insert(TABLE_NAME, null, contentValues)>0;
}

Пожалуйста, мне нужна помощь!


person Usama Sajid    schedule 24.08.2019    source источник
comment
Массив icons — это просто ints, поэтому icons[position] — это один int. Если это действительно то, что вы пытаетесь сохранить, нет необходимости в ByteArrayOutputStream, DataOutputStream и т. д. Просто сохраните int. Кроме того, я не вижу в вашем сообщении кода, связанного с базой данных.   -  person Mike M.    schedule 24.08.2019
comment
Я добавил свой код базы данных выше. Я просто хочу сохранить изображение в базе данных и получить его тоже. Неважно, находится ли он в массиве int или byte. Так что, пожалуйста, помогите мне здесь!   -  person Usama Sajid    schedule 24.08.2019
comment
Вы не хотите хранить изображения в базе данных. Это просто плохо. Если изображения всегда будут только в ваших ресурсах — т. е. они всегда будут иметь R.drawable — было бы лучше как-то хранить это и загружать их из ресурсов при необходимости. Поскольку идентификатор int может измениться при перестроении, вероятно, самым простым и надежным способом будет сохранить имя ресурса в БД и изменить его обратно на int при его извлечении. Взгляните на второй блок кода в этом ответе, который вы можете использовать для переключения между именем ресурса и значением int.   -  person Mike M.    schedule 24.08.2019
comment
тогда как я могу получить имя ресурса выбранного значка?   -  person Usama Sajid    schedule 24.08.2019
comment
С методом iconName() там. Например, если вы вызываете String name = iconName(icons[0]);, то name будет "personalbusaccount", и это то, что будет храниться в базе данных. Когда вам нужно загрузить изображение, вы получите значение "personalbusaccount" из вашего Cursor — например, String iconName = cursor.getString(...); — и вы передадите его методу iconRes()int resId = iconRes(iconName);. Затем вы можете использовать это с ImageView#setImageResource(resId), getDrawable(resId) и т. д.   -  person Mike M.    schedule 24.08.2019
comment
Каким будет метод iconName()?   -  person Usama Sajid    schedule 24.08.2019
comment
Методы iconName() и iconRes() находятся во втором блоке кода в ответе, на который я ссылался ранее.   -  person Mike M.    schedule 24.08.2019
comment
Я пытаюсь это сделать, но возвращает ноль. 'Bitmap largeIcon = BitmapFactory.decodeResource(getResources(),iconRes(getResources().getResourceName(icons[position]))); 'и приложение вылетает   -  person Usama Sajid    schedule 25.08.2019
comment
Какие файлы вы рисуете? То есть они jpg, или png, или xml и т.д.?   -  person Mike M.    schedule 25.08.2019
comment
большинство из них в формате svg, а другие в формате png.   -  person Usama Sajid    schedule 25.08.2019
comment
Я тоже пробовал это, но изображение не отображается в браузере БД.. int ic = iconRes(iconName(icons[position])); accountIcon = inttoByteArray(ic);   -  person Usama Sajid    schedule 25.08.2019
comment
BitmapFactory не будет работать с svgs. Он обрабатывает только растровые изображения, такие как bmp, jpg, png и т. д. Когда вы загружаете изображения, вам не нужны Bitmap. Вам просто нужно Drawables. Вместо этого используйте getDrawable() или ContextCompat.getDrawable(), чтобы получить их.   -  person Mike M.    schedule 25.08.2019
comment
И избавьтесь от этого inttoByteArray() метода. Вам это больше не нужно. Теперь вы просто сохраняете String в базе данных.   -  person Mike M.    schedule 25.08.2019
comment
Не могли бы вы дать закодированный ответ? Извините, я новичок в Android и многого не знаю. и как я могу получить его тоже   -  person Usama Sajid    schedule 25.08.2019
comment
Спасибо, сэр ! Это сделано. Большое уважение к вам, вы были очень скромны   -  person Usama Sajid    schedule 25.08.2019