ORMLite with CursorAdapter in Android ORMLite with CursorAdapter in Android android android

ORMLite with CursorAdapter in Android


Your comments indicate that you've already answered you problem. You can certainly create a column named "_id" using ORMLite:

@DatabaseField(generatedId = true)private int _id;

or

@DatabaseField(generatedId = true, columnName = "_id")private int id;

If you are working with Cursors then you may want to take a look at the last() and moveAbsolute(...) methods on the DatabaseResults class. Also, the AndroidDatabaseResults (which you can cast to) also has a getRawCursor() method which returns the underlying Cursor object and has additional getCount() and getPosition() methods.

Here are some more information about ORMLite and Cursors:

Android Cursor with ORMLite to use in CursorAdapter

You can get access to the Cursor using something like the following:

// build your queryQueryBuilder<Foo, String> qb = fooDao.queryBuilder();qb.where()...;// when you are done, prepare your query and build an iteratorCloseableIterator<Foo> iterator = dao.iterator(qb.prepare());try {   // get the raw results which can be cast under Android   AndroidDatabaseResults results =       (AndroidDatabaseResults)iterator.getRawResults();   Cursor cursor = results.getRawCursor();   ...} finally {   iterator.closeQuietly();}


It turns out I did need a raw SQL query with ORMLite after all as I needed to do a Left Join, (i.e. not as a result of having to rename the id column in a query, that is not necessary as per Gray's answer above)

The way I did it is below:

public class DatabaseHelper extends OrmLiteSqliteOpenHelper{   public void myRawQueryMethod() {        SQLiteDatabase database = this.getReadableDatabase();        String SqlQuery = "Write raw SQL query here";         Cursor cursor = database.rawQuery(SqlQuery, null);    }}

Thanks for advice


Wrap your cursor with another one that treats "_id" as an alias to your real primary key column. Example:

cursor = new CursorWrapper(cursor) {                @Override                public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException {                    if ("_id".equals(columnName)) columnName = "id";                    return super.getColumnIndexOrThrow(columnName);                }            };