2011-02-03 17 views
1

ここで私のAndroid Appで現在対処している問題があります。プログラムは問題なくエミュレータで正常に動作しますが、同じOSを実行している実際のデバイスではエラーが発生します。エミュレータ上にないAndroidデバイスのIndexOutOfBoundsExceptionエラー

  1. 私のウィジェットを更新するApp Widget Update Serviceがあります。このサービスは、ウィジェットが画面上にあるかどうかをチェックします。そうでなければ、更新プロセスを実行しません。エミュレータで正常に動作します。

  2. OnReceiveメソッドでウィジェットを更新する必要があるたびに、その変数のENABLED、DELETED、UPDATEインテントのいずれかを示す文字列変数check_intentにインテントを取り込みます。

  3. フィールドが1つだけ有効なSQLiteテーブルtuuserid_widget_enabledがあります。インテントを有効にすると、1にトグルし、削除すると0にトグルします。

  4. インテントがUPDATEの場合、DBテーブルの有効化フィールドが1であるかどうかをチェックします(trueの場合)。これは、デバイス上のCursor Index Out of Boundsエラーを取得するところですが、すべてがエミュレータで期待通りに機能します。

私はこれに関する助けに感謝します。前もって感謝します。申し訳ありませんが、私が間違っていた場合、私はAndroidを学んでいます。ここで

は誤りである -

ここ
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 [email protected] 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 

コードスニペットです。

@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(); 
      } 
     } 

    } 

答えて

1

カーソル/データベースはおそらく空で、行はありません。試してみてください:

if (cur.moveToFirst()) { // returns false if cursor is empty 
    widget_enabled = cur.getInt(0); 
} else { 
    widget_enabled = 0; 
} 
+0

私はテーブルに行があり、値が1であることを確認しましたが、私はこれをとにかく試してみます。ありがとう。 – Aakash