Хобрук: Ваш путь к мастерству в программировании

Изображение не загружается в базу данных SQLite

Я новичок в программировании для Android, поэтому, надеюсь, кто-то может помочь. Были проблемы с попыткой добавить изображение из галереи или камеры в мою базу данных SQLite. Я наткнулся на чей-то GitHub, у которого была CameraGallerySqliteDemo здесь

Я попытался изменить код для своих нужд, но не смог добавить изображение в свою таблицу gallery.

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

public class add_gallery extends AppCompatActivity {

    Button addImage;
    ArrayList<Gall> imageArry = new ArrayList<Gall>();
    GalleryImageAdapter imageAdapter;
    private static final int CAMERA_REQUEST = 1;
    private static final int PICK_FROM_GALLERY = 2;
    ListView dataList;
    //maybe change to image title later
    byte[] imageName;
    int imageId;
    Bitmap theImage;
    DatabaseHelper myDb;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_gallery);
        dataList = (ListView) findViewById(R.id.list);
        /**
         * create DatabaseHelper object
         */
        myDb = new DatabaseHelper(this);
        /**
         * Reading and getting all records from database
         */
        List<Gall> images = myDb.getAllGallery();
        for (Gall cn : images) {
            String log = "ID:" + cn.getID() + " Image: " + cn.getImage()
                    + " ,Title: " + cn.getTitle()
                    + " ,Caption: " + cn.getCaption();

            // Writing Galls to log
            Log.d("Result: ", log);
            // add images data in arrayList
            imageArry.add(cn);

        }
        /**
         * Set Data base Item into listview
         */
        imageAdapter = new GalleryImageAdapter(this, R.layout.gallery_list,
                imageArry);
        dataList.setAdapter(imageAdapter);
        /**
         * go to next activity for detail image
         */
        dataList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View v,
                                    final int position, long id) {
                imageName = imageArry.get(position).getImage();
                imageId = imageArry.get(position).getID();

                Log.d("Before Send:****", imageName + "-" + imageId);
                // convert byte to bitmap
                ByteArrayInputStream imageStream = new ByteArrayInputStream(
                        imageName);
                theImage = BitmapFactory.decodeStream(imageStream);
                Intent intent = new Intent(add_gallery.this,
                        DisplayImageActivity.class);
                intent.putExtra("imageid", imageId);
                intent.putExtra("imagename", theImage);
                startActivity(intent);

            }
        });
        /**
         * open dialog for choose camera/gallery
         */

        final String[] option = new String[] { "Take from Camera",
                "Select from Gallery" };
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.select_dialog_item, option);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setTitle("Select Option");
        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                Log.e("Selected Item", String.valueOf(which));
                if (which == 0) {
                    callCamera();
                }
                if (which == 1) {
                    callGallery();
                }

            }
        });
        final AlertDialog dialog = builder.create();

        addImage = (Button) findViewById(R.id.btnAdd);

        addImage.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                dialog.show();
            }
        });
    }

    /**
     * On activity result
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK)
            return;

        switch (requestCode) {
            case CAMERA_REQUEST:

                Bundle extras = data.getExtras();

                if (extras != null) {
                    Bitmap yourImage = extras.getParcelable("data");
                    // convert bitmap to byte
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    yourImage.compress(Bitmap.CompressFormat.PNG, 100, stream);
                    byte imageInByte[] = stream.toByteArray();
                    Log.e("output before conversion", imageInByte.toString());
                    // Inserting Galls
                    Log.d("Insert: ", "Inserting ..");
                    myDb.addGallery(new Gall("Android", imageInByte));
                    Intent i = new Intent(add_gallery.this,
                            add_gallery.class);
                    startActivity(i);
                    finish();

                }
                break;
            case PICK_FROM_GALLERY:
                Bundle extras2 = data.getExtras();

                if (extras2 != null) {
                    Bitmap yourImage = extras2.getParcelable("data");
                    // convert bitmap to byte
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    yourImage.compress(Bitmap.CompressFormat.PNG, 100, stream);
                    byte imageInByte[] = stream.toByteArray();
                    Log.e("output before conversion", imageInByte.toString());
                    // Inserting Galls
                    Log.d("Insert: ", "Inserting ..");
                    myDb.addGallery(new Gall("Android", imageInByte));
                    Intent i = new Intent(add_gallery.this,
                            add_gallery.class);
                    startActivity(i);
                    finish();
                }

                break;
        }
    }

    /**
     * open camera method
     */
    public void callCamera() {
        Intent cameraIntent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        cameraIntent.putExtra("crop", "true");
        cameraIntent.putExtra("aspectX", 0);
        cameraIntent.putExtra("aspectY", 0);
        cameraIntent.putExtra("outputX", 200);
        cameraIntent.putExtra("outputY", 150);
        startActivityForResult(cameraIntent, CAMERA_REQUEST);

    }

    /**
     * open gallery method
     */

    public void callGallery() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 0);
        intent.putExtra("aspectY", 0);
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 150);
        intent.putExtra("return-data", true);
        startActivityForResult(
                Intent.createChooser(intent, "Complete action using"),
                PICK_FROM_GALLERY);

    }
}

Ниже приведен метод, который я вызываю для добавления изображения в галерею, addGallery

public// Adding new image to gallery
    void addGallery(Gall gallery) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(IMAGE, gallery._image);
        values.put(TITLE, gallery._title);
        values.put(CAPTION, gallery._caption);

        // Inserting Row
        db.insert(GALLERY_TABLE, null, values);
        db.close(); // Closing database connection
    }

Ниже представлен класс Gall

public class Gall {

    // private variables
    int _id;
    byte[] _image;
    String _title;
    String _caption;

    // Empty constructor
    public Gall() {

    }

    // constructor
    public Gall(int keyId, byte[] image, String title, String caption) {
        this._id = keyId;
        this._image = image;
        this._title = title;
        this._caption = caption;

    }
    public Gall(byte[] image, String title, String caption) {
        this._image = image;
        this._title = title;
        this._caption = caption;

    }
    public Gall(int keyId) {
        this._id = keyId;

    }

    // getting ID
    public int getID() {
        return this._id;
    }

    // setting id
    public void setID(int keyId) {
        this._id = keyId;
    }

    // getting image
    public byte[] getImage() {
        return this._image;
    }

    // setting image
    public void setImage(byte[] image) {
        this._image = image;
    }

    // getting
    public String getTitle() {
        return this._title;
    }

    // setting title
    public void setTitle(String title) {
        this._title = title;
    }

    // getting caption
    public String getCaption() {
        return this._title;
    }

    // setting caption
    public void setCaption(String caption) {
        this._title = caption;
    }

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


  • см. это 07.04.2016
  • Никогда не рекомендуется хранить изображения в базе данных. вы можете хранить пути, но не само изображение. 07.04.2016

Ответы:


1

Сохраните изображение в виде массива байтов в БД. Посмотрите пример здесь. Это может помочь вам.

07.04.2016
  • Мои извинения, я очень новичок в этом, многое из того, что я уже сделал, прошло через мою голову, но я предположил, что эта строка кода хранит изображение в виде массива байтов ByteArrayOutputStream stream = new ByteArrayOutputStream(); В вашем примере вы ссылаетесь на создание утилиты учебный класс? 07.04.2016

  • 2

    Вы должны сохранить свои изображения в папке и сохранить их пути в вашей базе данных. Если вы хотите, чтобы ваши изображения были защищены, и не хотите показывать их в галерее, то есть несколько способов, таких как использование файлов .nomedia, или вы можете сохранить свои изображения в личной папке, которая не будет доступна никакому другому приложению, кроме вашего. .

    07.04.2016
    Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..