Im trying to get data from my DB.
This is my code:
String[] columns = new String[] {COLUMN_FACEBOOK_ALBUM_COVER, COLUMN_FACEBOOK_ALBUM_IS_ACTIVE};
I have similar answer as Oladipo Olasemo but happens to me for v-tables and how I was able to fix it. I believe this is the best post to share my experience with this error especially dealing with FTS3 virtual tables, well at least in my case. There are a lot of question regarding this and OP's original question is too generic so here is my take on this question.
I encountered this error due to some restrictions in virtual table consider this one:
create virtual table V1 using FTS3 (content="MyTable", content1, content2);
When I search for a specific keyword base on content1 or content2, I realize I was making a query base on the virtual table via this query:
select * from V1 where V1 match 'hello'
Since this is a virtual table I missed that, it will project the result set according to how you constructed the v-table itself. So it will have columns only for content1 and content2.
I am developing an android app which queries from search results and upon selecting an item from the result set, my backend processing process the selected item and queries for an information that does not exist from the column set. Thus, giving me this error.
The way I solved this, though not so brilliant, is to querythe result from the v-table to get the id for each item, which it always has. Then I construct a query string base from the result ids I acquired then use that to retrieve the necessary data with the projection I required. I got an idea from this question
I believe there are lot more ways to encounter this error. I spent almost an hour figuring out what might have caused this. For me, the error projected on the log is not very helpful. It really helps if you really know how data flows within your app.
Initialize cursors in database transaction.
Cursor cAlbum = null, cImage = null;
db.beginTransaction();
try {
// init cursors
cAlbum = db.query(...);
cImage = db.query(...);
} catch(SQLException e) {
e.printStackTrace();
} finally {
db.endTransaction();
}
Check if cursors are not null.
if(cAlbum != null && cImage != null) {
while(cAlbum.moveToNext()) {
// get data from cAlbum and do what you need
}
while(cImage.moveToNext()) {
// get data from cImage and do what you need
}
cAlbum.close();
cImage.close();
}
Try calling cursor.moveToFirst ()
before using the cursor. Let me know if that worked.
In my case it was because I didn't include the column in the projection passed into the CursorLoader constructor. Which means I was trying to access data from a column that didn't exist in the cursor that was returned.
I hope this helps somebody...
Maybe you are using your old database. If you changed some tables, fields on your database and you are now trying on another device (which is you already installed your application before database changes), you should only delete your old database and create new file.
You should fix this to solve the following error message
Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
It works in my code.
Try to position cursor by moveToFirst
before reading data from it.
Check for null-> if (c != null && c.moveToFirst()) {}
Check for count-> (c != null && c.getCount() >0 && c.moveToFirst()){}