2011-04-30 45 views
0

我正在開發一個Android應用程序,但我被卡在刪除我的數據庫中的東西! 我得到了「不能引用非內部類中定義的非最終變量數據庫」錯誤!我知道這個錯誤意味着什麼,但我似乎無法找到解決辦法。不能引用在一個不同的方法中定義的內部類中的非最終變量數據庫

這裏是我的代碼

package iwt.ehb.be.capita_selecta; 

//my imports 

public class RemoveActivity extends Activity { 

    Context context = this; 

    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.remove_activity); 

     DBAdapter db = new DBAdapter(this); 
     db.open(); 
     Cursor c = db.getAllTrips(); 

     if(c.moveToFirst()) 
     { 
      LinearLayout layout = (LinearLayout) findViewById(R.id.layout_removeTrips); 

      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
      lp.setMargins(5, 5, 5, 5); 

      do { 
       Button buttonView = new Button(this); 
       buttonView.setBackgroundResource(R.layout.btn_blue); 
       buttonView.setLayoutParams(lp); 
       buttonView.setText(c.getString(1) + " @ " + c.getString(2)); 
       final int id_trip = c.getInt(0); 
       buttonView.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         System.out.println(id_trip); 

         AlertDialog.Builder alert = new AlertDialog.Builder(context).setTitle("Attention"); 
         alert.setMessage("Do you wish to delete this trip?"); 
         alert.setIcon(R.drawable.icon); 
         alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           db.deleteSpecificRecord(id_trip); 
          } 
         }); 
         alert.setNegativeButton("No", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           dialog.cancel(); 
          } 
         }); 

         alert.show(); 
        } 
       }); 
       layout.addView(buttonView); 
      } while (c.moveToNext()); 
     } 
     db.close(); 

     //******************* 
     //BACK-button 
     //******************* 

     Button back = (Button) findViewById(R.id.back); 
     back.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(); 
       setResult(RESULT_OK, intent); 
       finish(); 
      } 
     }); 
    } 
} 

而我得到的錯誤在這行代碼db.deleteSpecificRecord(id_trip);

如果你對我怎麼能解決這個,這將是要命的任何想法;)

THX 凱文

回答

3

的問題是這一行:

AlertDialog.Builder alert = new AlertDialog.Builder(context).setTitle("Attention"); 

上下文是來自外部類的變量。只有這些變量是最終的,才能訪問這些變量。

有一些可能的修復。 第一個是讓你的活動實施onclicklistner

Public class RemoveActivity extends Activity implements OnClickListener { ... buttonView.setOnClickListener(this); 恕我直言最好的解決方案

另一個解決辦法是使變量上下文使用下面的代碼構造函數:

Public RemoveActivity(){ this.context = this;} 

但這難看的代碼

我也覺得改行

AlertDialog.Builder alert = new AlertDialog.Builder(RemoveActivity.this).setTitle("Attention"); 

會工作。

+0

或者您也可以叫爲'AlertDialog.Builder警報=新AlertDialog.Builder(v.getContext())的setTitle( 「注意」);'。把整個堆棧跟蹤可能會更有用,因爲問題可能來自其他地方:) – ccheneson 2011-04-30 17:09:56

+0

Thx爲您的答案,但那不是我的問題。我說我在「db.deleteSpecificRecord(id_trip);」如果我註釋掉這行代碼,一切工作正常。當我嘗試刪除評論,然後數據庫獲得紅色下劃線,並說我的問題是「不能指一個......」 – Kevin 2011-05-01 10:26:34

+0

那麼故事是一樣的。您無法訪問它,因爲您處於內部類中,因此無法訪問該類中的變量。 OnClickListener是您正在實現的抽象方法的接口。不允許混淆db變量,因爲它在RemoveActivity中。要麼做他所說的話,並使其成爲最終變量或使RemoveActivity實現該接口。然後在RemoveActivity類中創建一個db字段。 – 2011-05-01 18:58:27

0

我有同樣的錯誤。與此有關的是,java用一個獨立的作用域來對待每個函數。我看到你已經在Create函數中聲明瞭db Adapter對象。接受聲明並在創建函數之前聲明它(而不是擴展範圍),這應該可以解決問題。您的代碼應該是這樣的:)

public class RemoteActivity extends Activity{ 
DBAdapter db = new DBAdapter(this); 
Context context = this; 

onCreate() ... 
相關問題