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){
}
}
}
}