我有一个数据库,其中有一行数据将在多个活动中使用。我需要能够在所有活动中保持行id可用,这样我就可以使用db适配器在不同的活动中读写数据。我已经成功地通过一个意图将一个行ID传递给下一个活动。MROWID变量然后使用GETUPLE(Profile .java)给出行ID。我现在遇到的问题是让mrowid可用于其他活动,例如mycovery和drinkslist,这样我可以在进行时更新数据。
你可以看到我试过PutExtras,PutSerializable,但没能成功。我想我错过了一些理解。
因此,对于下面活动中的“我的配置文件”菜单选项,我可以将光标行id的值发送到配置文件类:

 public class Overthelimit extends ListActivity {
private OverLimitDbAdapter dbHelper;
private Cursor cursor;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    this.getListView();
    dbHelper = new OverLimitDbAdapter(this);
    dbHelper.open();
    fillData();
    registerForContextMenu(getListView());
}


@Override
protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    fillData();

}
private void fillData() {
    cursor = dbHelper.fetchAllUserDrinks();
    startManagingCursor(cursor);
    //cursor.getCount();

    String[] from = new String[] { OverLimitDbAdapter.KEY_USERNAME };
    int[] to = new int[] { R.id.label };

    // Now create an array adapter and set it to display using our row
    SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
            R.layout.user_row, cursor, from, to);
    setListAdapter(notes);
}



@Override
protected void onDestroy() {
    super.onDestroy();
    if (dbHelper != null) {
        dbHelper.close();
    }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
    case R.id.profile:
        Intent myIntent1 = new Intent(this, Profile.class);
        if(cursor.getCount() != 0) {
            //Toast.makeText(getApplicationContext(), "no profile",Toast.LENGTH_SHORT).show();
            myIntent1.putExtra(OverLimitDbAdapter.KEY_ROWID, cursor.getString(cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID)));
        }
        startActivityForResult(myIntent1, 0);
        return true;
    case R.id.myusual:
        Intent myIntent2 = new Intent(this, MyUsual.class);
        startActivityForResult(myIntent2, 0);
        return true;
    case R.id.trackme:
        Intent myIntent3 = new Intent(this, TrackMe.class);
        startActivityForResult(myIntent3, 0);
        return true;
    case R.id.moreinfo:
        Intent myIntent4 = new Intent(this, MoreInfo.class);
        startActivityForResult(myIntent4, 0);
        return true;


    }
    return super.onOptionsItemSelected(item);
}

}

然后将其作为mrowid在下面的“我的配置文件”活动中可用:
mRowId = (bundle == null) ? null :
                (Long) bundle.getSerializable(OverLimitDbAdapter.KEY_ROWID);
             if (mRowId == null) {
                Bundle extras = getIntent().getExtras();
                mRowId = extras != null ? Long.parseLong(extras.getString(OverLimitDbAdapter.KEY_ROWID))
                                        : null;
            }

然后我需要把这个mrowid提供给我平时的另一个活动,叫做酒鬼。因此,我在下面用一个带有drink1按钮的onclicklistener尝试将行id发送到drinkslist:
public class MyUsual extends Activity {
private Long mRowId;
private OverLimitDbAdapter mDbHelper;
private Cursor cursor;
private TextView mDrink1Label;
private TextView mDrink1Units;

/** Called when the activity is first created. */
@Override
public void onCreate(final Bundle bundle) {
    super.onCreate(bundle);
    mDbHelper = new OverLimitDbAdapter(this);
    mDbHelper.open();
    setContentView(R.layout.my_usual);
    mDrink1Label = (TextView) findViewById(R.id.drink1Label);
    mDrink1Units = (TextView) findViewById(R.id.drink1Units);




    Button drink1 = (Button) findViewById(R.id.drink1Button);

    // get intent data i.e. which drink button pressed and mRowId
          mRowId = (bundle == null) ? null :
            (Long) bundle.getSerializable(OverLimitDbAdapter.KEY_ROWID);
         if (mRowId == null) {
            Bundle extras = getIntent().getExtras();
            mRowId = extras != null ? Long.parseLong(extras.getString(OverLimitDbAdapter.KEY_ROWID))
                                    : null;
        }

        //populateFields();

        drink1.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {
             setResult(RESULT_OK);
                //finish();
                Intent myIntent1 = new Intent(view.getContext(), DrinksList.class);
                myIntent1.putExtra("drinkButton", "drink1");

                if(cursor.getCount() != 0) {
                    myIntent1.putExtra(OverLimitDbAdapter.KEY_ROWID, cursor.getString(cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID)));
                }

             startActivityForResult(myIntent1, 0);
         }

        });




}

protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            //saveState();
            outState.putSerializable(OverLimitDbAdapter.KEY_ROWID, mRowId);
        }
}

从drinkslist中,我选择了一种饮料,我需要使用mrowid通过onlistitemclick将数据写入数据库:
public class DrinksList extends ListActivity {
private ProgressDialog m_ProgressDialog = null;
private ArrayList<CreateDrinkOption> m_drinks = null;
private DrinkAdapter m_adapter;
private Runnable viewDrinks;
private String drinkButton;
private Long mRowId;
private OverLimitDbAdapter mDbHelper;
private String databaseRow;
private Cursor cursor;

/** Called when the activity is first created. */

@Override
 public void onCreate(Bundle bundle) {
     super.onCreate(bundle);
     setContentView(R.layout.drinks_list);
     mDbHelper = new OverLimitDbAdapter(this);
     mDbHelper.open();
     m_drinks = new ArrayList<CreateDrinkOption>();
     this.m_adapter = new DrinkAdapter(this, R.layout.drink_row, m_drinks);
             setListAdapter(this.m_adapter);


     viewDrinks = new Runnable(){
         @Override
         public void run() {
             getDrinks();
         }
     };
 Thread thread =  new Thread(null, viewDrinks, "MagentoBackground");
     thread.start();
     m_ProgressDialog = ProgressDialog.show(DrinksList.this,
           "Please wait...", "Retrieving data ...", true);



// get intent data i.e. which drink button pressed and mRowId
     mRowId = (bundle == null) ? null :
        (Long) bundle.getSerializable(OverLimitDbAdapter.KEY_ROWID);
     if (mRowId == null) {
        Bundle extras = getIntent().getExtras();
        drinkButton = extras.getString(drinkButton);
        mRowId = extras != null ? Long.parseLong(extras.getString(OverLimitDbAdapter.KEY_ROWID))
                                : null;
    }


 }

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //saveState();
    outState.putSerializable(OverLimitDbAdapter.KEY_ROWID, mRowId);
}


 private Runnable returnRes = new Runnable() {

     @Override
      public void run() {
          if(m_drinks != null && m_drinks.size() > 0){
              m_adapter.notifyDataSetChanged();
              for(int i=0;i<m_drinks.size();i++)
              m_adapter.add(m_drinks.get(i));
          }
          m_ProgressDialog.dismiss();
          m_adapter.notifyDataSetChanged();
      }
    };

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id)
    {
    try
    {
    super.onListItemClick(l, v, position, id);
    CreateDrinkOption bkg = (CreateDrinkOption)l.getItemAtPosition(position);
    String drink1type = bkg.getDrinkType().toString();
    float drink1units = (bkg.getPercentageByVolume() * bkg.getVolume());
    //Toast.makeText(this, mRowId.toString(), Toast.LENGTH_LONG).show();

    mDbHelper.updateDrink(mRowId, drink1type, drink1units);
    finish();

    }
    catch(Exception ex)
    {
    Toast.makeText(this, "error", Toast.LENGTH_LONG).show();
    }

   }



 private void getDrinks(){
     try{
         m_drinks = new ArrayList<CreateDrinkOption>();
         CreateDrinkOption o1 = new CreateDrinkOption();
         o1.setDrinkType("Beer - 1 pint");
         o1.setPercentageByVolume((float) 4.5);
         o1.setVolume((float) 0.5);
         m_drinks.add(o1);
         CreateDrinkOption o2 = new CreateDrinkOption();
         o2.setDrinkType("Wine - small glass");
         o2.setPercentageByVolume((float) 12);
         o2.setVolume((float) 0.125);
         m_drinks.add(o2);
         CreateDrinkOption o3 = new CreateDrinkOption();
         o3.setDrinkType("Spirit - single");
         o3.setPercentageByVolume((float) 40);
         o3.setVolume((float) 0.25);
         m_drinks.add(o3);
         CreateDrinkOption o4 = new CreateDrinkOption();
         o4.setDrinkType("Alcopop - bottle");
         o4.setPercentageByVolume((float) 5);
         o4.setVolume((float) 0.275);
         m_drinks.add(o4);
            Thread.sleep(1000);
         Log.i("ARRAY", ""+ m_drinks.size());
       } catch (Exception e) {
        Log.e("BACKGROUND_PROC", e.getMessage());
       }
       runOnUiThread(returnRes);
   }

 private class DrinkAdapter extends ArrayAdapter<CreateDrinkOption> {

     private ArrayList<CreateDrinkOption> items;

     public DrinkAdapter(Context context, int textViewResourceId, ArrayList<CreateDrinkOption> items) {
              super(context, textViewResourceId, items);
              this.items = items;
      }

     @Override
      public View getView(int position, View convertView, ViewGroup parent) {
              View v = convertView;
              if (v == null) {
                  LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                  v = vi.inflate(R.layout.drink_row, null);
              }
              CreateDrinkOption o = items.get(position);
              if (o != null) {
                      TextView tt = (TextView) v.findViewById(R.id.drinkdetail);
                      TextView bt = (TextView) v.findViewById(R.id.drinkunits);
                      if (tt != null) {
                            tt.setText("Type: "+o.getDrinkType());
                      }
                      if(bt != null){
                            bt.setText("Units: "+ String.valueOf(o.getPercentageByVolume() * o.getVolume()));
                      }
              }
              return v;


    }

 }


}

很抱歉发了这么长的帖子,但是我需要做的就是让mrowid的这个值对所有活动都可用,这样我就可以在任何时候读/写数据了。如果应用程序暂停或被来电打断,数据也需要在那里,所以我使用onSaveInstanceState。
好的,谢谢。所以回复好的答案,我已经做到了,但它崩溃了,试图获得数据。我的申请课程是:
public class OverthelimitApplication extends Application {
private Long rowId;
public Long getRowId() {
    return rowId;
}
public void setRowId(Long value) {
    rowId = value;
}
}

然后用这个设置值:
OverthelimitApplication app1 = (OverthelimitApplication)getApplicationContext();
    app1.setRowId((long) cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID));

然后尝试用这个值,它就会崩溃:
mRowId = ((OverthelimitApplication) getApplicationContext()).getRowId();

我已经修好了!使用这个集合得到:
app1.setRowId(Long.parseLong(cursor.getString(cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID))));

mRowId = (long)((OverthelimitApplication)getApplicationContext()).getRowId();

我仍然需要指定设置和获取的时间。谢谢你的意见。

最佳答案

另一种方法是创建可用于所有活动的应用程序类。
要做到这一点,你必须扩展你的清单

 <application
    ..
    android:name=".MyApplication" >

创建一个新类
public class MyApplication extends Application {
public int rowId = 0;
}

在活动中,可以通过
int mRowId = ((MyApplication) getApplicationContext()).rowId;

07-28 14:11