мой список не может показать все элементы в базе данных - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть приложение для хранения имени и изображения в базе данных. Затем я печатаю имя изображения в listview. Но я просто могу видеть первые три элемента из базы данных. Это показывает, что в окне полная ошибка. Нет проблем с базой данныхЯ проверил базу данных с помощью sqlitebrowser, и там есть все элементы. Вероятно, есть проблема с моим адаптером массива. В чем проблема? Также изображения имеют небольшой размер 30 КБ.Ошибка при попытке увидеть все изображения в ListView

Ошибка

W/CursorWindow: Window is full: requested allocation 5397663 bytes, free space 1143664 bytes, window size 2097152 bytes
W/CursorWindow: Window is full: requested allocation 5397663 bytes, free space 2023760 bytes, window size 2097152 bytes
Window is full: requested allocation 5397663 bytes, free space 2096700 bytes, window size 2097152 bytes
E/SQLiteCursor: onMove() return false. RequiredPos: 3 WindowStartPos: 3 WindowRowCount: 0(original count of query: 6) 

Метод OnCreate

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView listView = (ListView) findViewById(R.id.listView);

        final ArrayList<String> artName = new ArrayList<String>();
        artImage = new ArrayList<Bitmap>();

        ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,artName);
        listView.setAdapter(arrayAdapter);

        try {

            Main2Activity.database = this.openOrCreateDatabase("Arts", MODE_PRIVATE, null);
            Main2Activity.database.execSQL("CREATE TABLE IF NOT EXISTS arts (name VARCHAR, image BLOB)");

            Cursor cursor = Main2Activity.database.rawQuery("SELECT * FROM arts", null);//cursor is for data recieving

            int nameIx = cursor.getColumnIndex("name");
            int imageIx = cursor.getColumnIndex("image");

            cursor.moveToFirst();

            while (cursor != null) {

                artName.add(cursor.getString(nameIx));
                //adding bitmap into artImage
                byte[] byteArray = cursor.getBlob(imageIx);
                //decoding bitmaps
                Bitmap image = BitmapFactory.decodeByteArray(byteArray,0,byteArray.length);
                artImage.add(image);

                cursor.moveToNext();

                arrayAdapter.notifyDataSetChanged();//data degistiyse arrayadapter'a haber veriyor ve guncelleyip kullaniciya gosterir

            }


        } catch (Exception e) {
            e.printStackTrace();
        }

         //selecting saved images
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Intent intent = new Intent(getApplicationContext(), Main2Activity.class);
                intent.putExtra("info", "old");
                intent.putExtra("name", artName.get(position));
                intent.putExtra("position", position);

                startActivity(intent);

            }
        });

    }
}

ListView из xml

 <ListView
        android:id="@+id/listView"
        android:layout_width="368dp"
        android:layout_height="495dp"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="8dp" />

1 Ответ

1 голос
/ 02 апреля 2019

Окно курсора имеет ограничение 2 МБ, строка должна вписываться в окно курсора, она не может быть разделена между несколькими окнами курсора, и, следовательно, ваше изображение размером 5 МБ не может быть получено с помощью курсора (CursorWindow фактически является буфером для курсора ).

Лучший способ обработки таких изображений - хранить изображения в виде файлов и сохранять путь к изображению в базе данных. В этом ответе показан пример сохранения пути к изображению (а также изображения, когда размер изображения ниже определенного размера (100 КБ)), а также включены некоторые базовые сведения о предмете.

Неуклюжий способ хранения больших изображений, хотя НЕ РЕКОМЕНДУЕТСЯ , описан в Как использовать изображения в Android SQLite, размер которых превышает ограничения CursorWindow?

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