Here is the problem that I am dealing with right now with my Android App. Program works fine on emulator without any error but errors out on real device running same OS.
I have a App Widget Update Service that updates my Widget. This service checks whether the widget is on the screen otherwise does not go through the update process. Works fine on emulator.
Every time the widget has to be updated in the OnReceive method I capture the intent in a string variable check_intent which tells me if its ENABLED, DELETED or UPDATE intents.
I have a SQLite table tuuserid_widget_enabled which has only one field enabled. When the intent is enabled I toggle it to 1 and when deleted I toggle it to 0. Works fine.
When the intent is UPDATE I check if the enable field in the DB table is = 1 if true then I go ahead with the update. This is where I get the Cursor Index Out of Bounds error on the device but everything works as expected on the emulator.
I would appreciate any help on this. Thanks in advance. Sorry if I did something wrong, I am just learning Android.
Here is the error -
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): FATAL EXCEPTION: main
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): java.lang.RuntimeException: Unable to start service Test.TU.TUWidget$UpdateService@45d2b7d0 with Intent { cmp=Test.TU/.TUWidget$UpdateService }: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3282)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.app.ActivityThread.access$3600(ActivityThread.java:135)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2211)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.os.Handler.dispatchMessage(Handler.java:99)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.os.Looper.loop(Looper.java:144)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.app.ActivityThread.main(ActivityThread.java:4937)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at java.lang.reflect.Method.invokeNative(Native Method)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at java.lang.reflect.Method.invoke(Method.java:521)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at dalvik.system.NativeStart.main(Native Method)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at Test.TU.TUWidget$UpdateService.onStart(TUWidget.java:209)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.app.Service.onStartCommand(Service.java:420)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3267)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): ... 10 more
Here are the code snippets.
@Override
public void onReceive(Context context, Intent intent) {
check_intent = intent.getAction();
widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
AlarmManager alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate,PendingIntent.FLAG_UPDATE_CURRENT);
alarms.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+ PERIOD, newPending);
context.startService(new Intent(context, UpdateService.class));
}
public static class UpdateService extends Service {
@Override
public void onStart(Intent intent, int startId) {
if (check_intent.contains("APPWIDGET_ENABLED")){
TUDB tdb = new TUDB(getApplicationContext());
final SQLiteDatabase db = tdb.getReadableDatabase();
String update_sql = "update tuuserid_widget_enabled set enabled = '1';";
if(db.isOpen() && !db.isReadOnly()){
db.execSQL(update_sql);
db.close();
}
}
else
**if (check_intent.contains("APPWIDGET_UPDATE")){
TUDB tdb1 = new TUDB(getBaseContext());
final SQLiteDatabase db1 = tdb1.getReadableDatabase();
String check_widget_enabled = "select enabled from tuuserid_widget_enabled;";
if(db1.isOpen() && !db1.isReadOnly()){
Cursor cur = db1.rawQuery(check_widget_enabled, null);
cur.moveToFirst();
widget_enabled = cur.getInt(0); //this is where it bombs
cur.close();
db1.close();
}**
if (widget_enabled == 1){
RemoteViews updateViews = buildUpdate(getApplicationContext());
ComponentName thisWidget = new ComponentName(getApplicationContext(), TUWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
manager.updateAppWidget(thisWidget, updateViews);
}
}
else
if (check_intent.contains("APPWIDGET_DELETED")){
TUDB tdb = new TUDB(getBaseContext());
final SQLiteDatabase db = tdb.getReadableDatabase();
String update_sql = "update tuuserid_widget_enabled set enabled = '0';";
if(db.isOpen() && !db.isReadOnly()){
db.execSQL(update_sql);
db.close();
}
}
}
Your cursor/database is probably empty - no rows. Try: