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 Cursor
s 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 Cursor
s:
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); } };