Попытка получить длину нулевого массива в Cursor Adapter - PullRequest
0 голосов
/ 20 июня 2019

Я делаю небольшое приложение для инвентаризации, где пользователь будет вводить информацию о каком-либо продукте, затем с помощью камеры он сможет сделать снимок в магазине. Я использую SQLite для хранения данных. Мое приложение работает нормально, пока я Я хотел использовать камеру для хранения изображений. Тогда в моем CursorAdapter у меня была попытка получить длину нулевого массива.

Это учебные проекты, я никогда прежде не использовал Cursor Adapter с импортом изображений. Я пытался выяснить из сообщений на SO, но не получилось.

   imeDelaTextView.setText(imeDela);
   modeliAutomobilaTextView.setText(modeliAutomobila);
   cenaTextView.setText(String.valueOf(cenaDela));
   preostalaKolicinaTextView.setText(String.valueOf(preostalaKolicina));
   bitmap = BitmapFactory.decodeByteArray(slikaDela, 0, slikaDela.length);//error in this line
   slikaDelaImageView.setImageBitmap(bitmap);   

мой адаптер курсора:

public class DeloviCursorAdapet extends CursorAdapter {
        Bitmap bitmap;
       public DeloviCursorAdapet(Context context, Cursor cursor) {
        super(context, cursor, 0);
        }
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
        //LayoutInflater uzima input moj layout xml fajl odnosno, activity_main i pravi View objekat
        return LayoutInflater.from(context).inflate(R.layout.list_view, viewGroup, false);
    }
    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        TextView imeDelaTextView = view.findViewById(R.id.ime_dela);
        TextView modeliAutomobilaTextView = view.findViewById(R.id.modeli_kola);
        TextView cenaTextView = view.findViewById(R.id.cena);
        TextView preostalaKolicinaTextView = view.findViewById(R.id.kolicina);
        ImageView slikaDelaImageView = view.findViewById(R.id.slika);

        int imeDelaColumnIndex = cursor.getColumnIndex(DeoContract.DeoEntry.NAZIV_DELA);
        int modeliAutomobilaColumnIndex = cursor.getColumnIndex(DeoContract.DeoEntry.MODELI_AUTOMOBILA);
        int cenaColumnIndex = cursor.getColumnIndex(DeoContract.DeoEntry.CENA_DELA);
        int preostalaKolicinaColumnIndex = cursor.getColumnIndex(DeoContract.DeoEntry.PREOSTALA_KOLICINA);
        int slikaColumnIndex = cursor.getColumnIndex(DeoContract.DeoEntry.SLIKA_DELA);

        String imeDela = cursor.getString(imeDelaColumnIndex);
        String modeliAutomobila = cursor.getString(modeliAutomobilaColumnIndex);
        int cenaDela = cursor.getInt(cenaColumnIndex);
        int preostalaKolicina = cursor.getInt(preostalaKolicinaColumnIndex);
        byte[] slikaDela = cursor.getBlob(slikaColumnIndex);

        imeDelaTextView.setText(imeDela);
        modeliAutomobilaTextView.setText(modeliAutomobila);
        cenaTextView.setText(String.valueOf(cenaDela));
        preostalaKolicinaTextView.setText(String.valueOf(preostalaKolicina));
        bitmap = BitmapFactory.decodeByteArray(slikaDela, 0, slikaDela.length);//error in this line
        slikaDelaImageView.setImageBitmap(bitmap);   

    }
}

манифест

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.korisnik.katalogdelova">
<uses-feature android:name="android.hardware.camera" />

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".Edit"
        android:label="Izmeni deo"
        android:parentActivityName=".MainActivity" />
    <!-- Parent activity meta-data to support 4.0 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />

    <!--    identifikuje ContentPtovider na uredjaju
           ime klase provajder,odnsno gde se nalazi
           da li je ovaj provajder deljiv sa ostalim aplikacija ovde nije i zato je false-->
    <provider
        android:name=".data.DeloviProvider"
        android:authorities="com.example.korisnik.katalogdelova"
        android:exported="false"/>

1 Ответ

0 голосов
/ 20 июня 2019

Маловероятно, что Курсор равен null , если бы вы столкнулись с ошибкой до указанной вами ошибки.

  • Любой из методов SQLiteDatabase (запрос или rawQuery) не будет возвращать нулевой Курсор, если данные не были извлечены, тогда Курсор будет пустым, и я полагаю, что не было бы представления длясвязывать в этом случае.

Хранение изображений в базе данных не рекомендуется, они в основном являются раздутыми, рекомендуемый способ - сохранить изображение в виде файла и сохранить путь к изображению в базе данных (иличасть пути, которую можно использовать для извлечения изображения из файла).

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

  • Размер, который может поместиться, зависит от других столбцов, поскольку в CursorWindow должна помещаться полная строка, поэтому нет определенного размера

Даже на 1 МБ вы, вероятно, сможете извлечь только 1 строку за раз.

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

Этот ответ включает пример сохранения изображения размером до 100 КБ в базе данных, но в противном случае изображение сохраняется в виде файла и сохранения пути в базе данных.

  • Демаркация 100 КБ была основана на 35% быстрее, чем файловая система (то есть может быть, что хранение небольших изображений в базе данных может быть более эффективным, чем получение изображения по пути)

В этом вопросе и ответе показано средство для сохранения больших изображений (путем разбиения изображений на куски), но обратите внимание, что этот метод не рекомендуется.

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

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