繁体   English   中英

SQLite数据库Android应用程序在模拟器中无法在我的设备中正常运行

[英]SQLite database Android app works fine in emulator not in my device

我正在尝试使用SQLite创建本地图像数据库。 该应用程序在AVD中运行良好,但是当我尝试在Samsung S6(Android 7.0,API 24)中运行时。 经过几次尝试运行失败的应用程序,我已经恢复了我的设备。 然后应用程序运行了一次或两次,然后开始显示以下相同的错误。

    06-12 19:34:10.292 17670-22492/com.example.eberhardt.test16 E/CursorWindow: Failed to read row 0, column 1 from a CursorWindow which has 0 rows, 2 columns.
06-12 19:34:10.343 17670-22492/com.example.eberhardt.test16 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
    Process: com.example.eberhardt.test16, PID: 17670
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:318)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:762)
     Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
        at android.database.CursorWindow.nativeGetBlob(Native Method)
        at android.database.CursorWindow.getBlob(CursorWindow.java:416)
        at android.database.AbstractWindowedCursor.getBlob(AbstractWindowedCursor.java:45)
        at com.example.eberhardt.test16.MainActivity$featureDetection.doInBackground(MainActivity.java:343)
        at com.example.eberhardt.test16.MainActivity$featureDetection.doInBackground(MainActivity.java:314)
        at android.os.AsyncTask$2.call(AsyncTask.java:304)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
        at java.lang.Thread.run(Thread.java:762)

用于创建图像数据库的代码是

package com.example.eberhardt.test16;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import static android.provider.BaseColumns._ID;

public class imageDatabase extends SQLiteOpenHelper {
    private static final String TAG = imageDatabase.class.getSimpleName();

    private static final String DATABASE_NAME = "features.db";
    private static final int DATABASE_VERSION = 1;
    ContentResolver mContentResolver;

    public final static String COLUMN_NAME = "imagename";
    public final static String TABLE_NAME = "imagetable";

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


    @Override
    public void onCreate(SQLiteDatabase db) {
        final String SQT_CREATE_IMAGE_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_NAME + " BLOB" + ");";
        db.execSQL(SQT_CREATE_IMAGE_TABLE);
        Log.e(TAG, "Database creates successfully");
    }

    public void addToDb(byte[] image) throws SQLException {
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_NAME, image);
        SQLiteDatabase db = this.getWritableDatabase();
        db.insert(TABLE_NAME, null, cv);
        db.close();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(" DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

存储图像

switch (requestCode){
            case OPEN_GALLERY:
                if(resultCode == RESULT_OK && data != null){
                    Uri uri = data.getData();
                    try {
                        imageBitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                    imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
                    byte[] uploadData = outputStream.toByteArray();

                    imageDatabase dataBase = new imageDatabase(this);
                    dataBase.addToDb(uploadData);
                }
                break;
        }

读取图像

protected Void doInBackground(Void... voids) {
            imageDatabase imageDatabase = new imageDatabase(MainActivity.this);
            SQLiteDatabase mDatabase = imageDatabase.getReadableDatabase();
            Cursor cursor = mDatabase.rawQuery("Select * FROM imagetable", null);

            cursor.moveToFirst();
            Log.e("Number of rows", String.valueOf(cursor.getCount()));
            for(int i = 1; i <= cursor.getCount(); i++) {
                foundImage = false;
                byte[] imageReceive = cursor.getBlob(1);

                imageRDBitmap = BitmapFactory.decodeByteArray(imageReceive, 0, imageReceive.length);
                Mat imageConverted = new Mat(imageRDBitmap.getHeight(), imageRDBitmap.getWidth(), CvType.CV_8UC4);
                Utils.bitmapToMat(imageRDBitmap, imageConverted);

                initializeFeatures(imageConverted);
                int matchedPoints = recognizeFeature(ImageFrame);
                //Log.e("Checking for matched", String.valueOf(matchedPoints));
                if (matchedPoints > 20){
                    columnID = cursor.getInt(0);
                    foundImage = true;
                    break;
                }else{
                    cursor.moveToNext();
                }


            }
            if(cursor != null && !cursor.isClosed()){
                cursor.close();
                Log.e("RECEIVED FROM DATABASE", "is empty");
            }
            return null;
        }

上面的代码是存储和检索图像。 同样在Android清单中,我已授予读取和写入权限。 请帮助找到该问题的解决方案。

谢谢。

我们需要了解的错误日志的主线是:

Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

因此,光标在此处打开:

Cursor cursor = mDatabase.rawQuery("Select * FROM imagetable", null);

看起来它没有从该查询中得到任何回报。 我会检查您设备上的数据库,以确保表中有一行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM