0

So in my android app the user can take a picture then hits done and the image is decompiled to a byte array and added to a sql database. I am getting a crash when I try to get the image from the sql and I get an error.

Here is the logcat:

10-02 20:30:56.543 6259-6259/com.nick.mowen.receiptmanager E/CursorWindow: Failed to read row 0, column 0 from a CursorWindow which has 0 rows, 2 columns.
10-02 20:30:56.553 6259-6259/com.nick.mowen.receiptmanager E/AndroidRuntime: FATAL EXCEPTION: main
10-02 20:30:56.553 6259-6259/com.nick.mowen.receiptmanager E/AndroidRuntime: Process: com.nick.mowen.receiptmanager, PID: 6259
10-02 20:30:56.553 6259-6259/com.nick.mowen.receiptmanager E/AndroidRuntime: java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
10-02 20:30:56.553 6259-6259/com.nick.mowen.receiptmanager E/AndroidRuntime:     at android.database.CursorWindow.nativeGetLong(Native Method)
10-02 20:30:56.553 6259-6259/com.nick.mowen.receiptmanager E/AndroidRuntime:     at android.database.CursorWindow.getLong(CursorWindow.java:524)
10-02 20:30:56.553 6259-6259/com.nick.mowen.receiptmanager E/AndroidRuntime:     at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75)
10-02 20:30:56.553 6259-6259/com.nick.mowen.receiptmanager E/AndroidRuntime:     at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:220)
10-02 20:30:56.553 6259-6259/com.nick.mowen.receiptmanager E/AndroidRuntime:     at com.nick.mowen.receiptmanager.ManagerDatabaseAdapter.getImageAtPosition(ManagerDatabaseAdapter.java:90)
10-02 20:30:56.553 6259-6259/com.nick.mowen.receiptmanager E/AndroidRuntime:     at com.nick.mowen.receiptmanager.MainActivity.itemClicked(MainActivity.java:115)

Here is the database:

public class ManagerDatabaseAdapter{

    ManagerHelper helper;
    Context mContext;

    public ManagerDatabaseAdapter(Context context) {
        helper = new ManagerHelper(context);
    }

    public String getAllData () {
        String[] columns = {ManagerHelper.UID,ManagerHelper.NAME,ManagerHelper.CODE,ManagerHelper.ADDRESS};
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor cursor = db.query(ManagerHelper.TABLE_NAME, columns, null, null, null, null, null);
        StringBuffer buffer = new StringBuffer();
        while (cursor.moveToNext()){
            int cid = cursor.getInt(0);
            String name = cursor.getString(1);
            String code = cursor.getString(2);
            String adress = cursor.getString(3);
            buffer.append(cid+" "+name+" "+code+" "+adress+"/n");
        }
        db.close();
        cursor.close();
        return buffer.toString();
    }

    public String[] getDataArray(String name) {
        String[] columns = {ManagerHelper.NAME,ManagerHelper.ADDRESS};
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor cursor = db.query(ManagerHelper.TABLE_NAME, columns, ManagerHelper.NAME + " = '" + name + "'", null, null, null, null);
        String[] data = new String[3];
        cursor.moveToFirst();
        int index1 = cursor.getColumnIndex(ManagerHelper.NAME);
        int index3 = cursor.getColumnIndex(ManagerHelper.ADDRESS);
        data[0] = cursor.getString(index1);
        data[2] = cursor.getString(index3);
        db.close();
        cursor.close();
        return data;
    }

    public byte[] getDataByteArray(String name) {
        String[] columns = {ManagerHelper.CODE};
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor cursor = db.query(ManagerHelper.TABLE_NAME, columns, ManagerHelper.NAME + " = '" + name + "'", null, null, null, null);
        byte[] data;
        int index = cursor.getColumnIndex(ManagerHelper.CODE);
        data = cursor.getBlob(index);
        db.close();
        return data;
    }

    public String[] getDataAtPosition(int position) {
        String[] columns = {ManagerHelper.UID,ManagerHelper.NAME,ManagerHelper.ADDRESS};
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor cursor = db.query(ManagerHelper.TABLE_NAME, columns, null, null, null, null, null);
        cursor.moveToPosition(cursor.getCount() - position - 1);
        String[] data = new String[2];
        int index1 = cursor.getColumnIndex(ManagerHelper.NAME);
        int index3 = cursor.getColumnIndex(ManagerHelper.ADDRESS);
        data[0] = cursor.getString(index1);
        data[1] = cursor.getString(index3);
        db.close();
        cursor.close();
        return data;
    }

    public byte[] getImageAtPosition(int position) {
        String[] columns = {ManagerHelper.UID,ManagerHelper.CODE};
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor cursor = db.query(ManagerHelper.TABLE_NAME, columns, null, null, null, null, null);
        cursor.moveToPosition(cursor.getCount() - position - 1);
        int index = cursor.getColumnIndex(ManagerHelper.CODE);
        byte[] data = cursor.getBlob(index);
        db.close();
        cursor.close();
        return data;
    }

    public long insertData(String name, byte[] image, String Address) {
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(ManagerHelper.NAME, name);
        contentValues.put(ManagerHelper.CODE, image);
        contentValues.put(ManagerHelper.ADDRESS, Address);
        long id = db.insert(ManagerHelper.TABLE_NAME, null, contentValues);
        db.close();
        return id;
    }

    public int updatePlace(String oldName, String newName) {
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(ManagerHelper.NAME, newName);
        String[] whereArgs= {oldName};
        int count = db.update(ManagerHelper.TABLE_NAME, contentValues, ManagerHelper.NAME + " =?", whereArgs);
        db.close();
        return count;
    }

    public long deleteRow(String delete) {
        SQLiteDatabase db = helper.getWritableDatabase();
        String[] whereArgs = {delete};
        long id = db.delete(ManagerHelper.TABLE_NAME, ManagerHelper.NAME + " =?", whereArgs);
        db.close();
        return id;
    }

    public List<MainInfo> getNameArraylist() {
        String[] columns = {ManagerHelper.UID,ManagerHelper.NAME,ManagerHelper.ADDRESS};
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor cursor = db.query(ManagerHelper.TABLE_NAME, columns, null, null, null, null, null);
        List<MainInfo> names = new ArrayList<>();
        int index1 = cursor.getColumnIndex(ManagerHelper.NAME);
        int index3 = cursor.getColumnIndex(ManagerHelper.ADDRESS);
        while (cursor.moveToNext()) {
            MainInfo current = new MainInfo();
            current.Title = cursor.getString(index1);
            current.Address = cursor.getString(index3);
            names.add(cursor.getColumnIndex(ManagerHelper.UID), current);
        }
        cursor.close();
        db.close();
        return names;
    }

    static class ManagerHelper extends SQLiteOpenHelper {
        private static final String EXTRA_MESSAGE = "com.nick.mowen.receiptmanager.LOCATION";
        private static final String DATABASE_NAME = "Main_Data";
        private static final String TABLE_NAME = "DATA";
        private static final int VERSION = 2;
        private static final String UID = "_id";
        private static final String NAME = "Codes";
        private static final String CODE = "Code";
        private static final String ADDRESS = "Address";
        private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+" ("+UID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(255), "+CODE+" BLOB,"+ADDRESS+" VARCHAR(255));";
        private static final String DROP_TABLE = "DROP_TABLE IF EXISTS"+TABLE_NAME;
        private Context context;

        public ManagerHelper(Context context) {
            super(context, DATABASE_NAME, null, VERSION);
            this.context=context;
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            Intent intent = new Intent(context,CodeAdder.class);
            intent.putExtra(EXTRA_MESSAGE, true);
            context.startActivity(intent);

            try {
                db.execSQL(CREATE_TABLE);
            } catch (SQLException e) {

            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            try {
                db.execSQL(DROP_TABLE);
                onCreate(db);
            }catch (SQLException e){

            }
        }

    }
}
Nick Mowen
  • 2,572
  • 2
  • 22
  • 38
  • try http://stackoverflow.com/a/10483887/5202007 – Mohammad Tauqir Oct 03 '15 at 01:40
  • Thank your lucky stars that it doesn't work. It's a horrible idea to save an image inside the database. Just save the path to the image and save the image separately – e4c5 Oct 03 '15 at 06:37

0 Answers0