2014-10-28 36 views
0

我從誰可以將對象添加到我的數據庫中得到了此活動的AddFood。 當我從一個類打開活動(後來的類顯示listview中的數據庫內容),一切正常。從兩個類中添加到sqlite數據庫

但是,當我從我的主類打開AddFood活動時,請填寫該字段並單擊添加,它會在顯示列表視圖的類中查找它時顯示它。

這是我的AddFood類減去進口。

package com.example.mappe3; 

public class AddFood extends Activity implements OnClickListener{ 

private HousekeepingDBHelper hkDBhelper; 

private EditText itemFood, itemWeight, itemPrice, itemBrand, itemCategory; 
private String setFood, setWeight, setPrice, setBrand, setCategory; 
private Spinner catagorySpinner; 
private Button addButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_add_food); 
    hkDBhelper = new HousekeepingDBHelper(this); 

    itemFood = (EditText)findViewById(R.id.itemFood); 
    itemWeight = (EditText)findViewById(R.id.itemWeight); 
    itemPrice = (EditText)findViewById(R.id.itemPrice); 
    itemBrand = (EditText)findViewById(R.id.itemBrand); 
    itemCategory = (EditText)findViewById(R.id.itemCategory); 

    catagorySpinner = (Spinner)findViewById(R.id.catagory_spinner); 


    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
      R.array.catagory_array, android.R.layout.simple_spinner_item); 

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    catagorySpinner.setAdapter(adapter); 

    addButton = (Button)findViewById(R.id.addButton); 
    addButton.setOnClickListener(this); 
} 

public void addItem(){ 
    setFood = itemFood.getText().toString(); 
    setWeight = itemWeight.getText().toString(); 
    setPrice = itemPrice.getText().toString(); 
    setBrand = itemBrand.getText().toString(); 
    setCategory = catagorySpinner.getSelectedItem().toString(); 


    if(setFood.length() != 0 && setWeight.length() != 0 && setPrice.length() != 0 
      && setBrand.length() != 0 && setCategory.length() != 0){ 
     Intent newIntent = getIntent(); 
     newIntent.putExtra("tag_grocery_foodItem", setFood); 
     newIntent.putExtra("tag_grocery_weight", setWeight); 
     newIntent.putExtra("tag_grocery_price", setPrice); 
     newIntent.putExtra("tag_grocery_brand", setBrand); 
     newIntent.putExtra("tag_grocery_category", setCategory); 

     this.setResult(RESULT_OK, newIntent); 
     finish(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.add_food, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onClick(View v) { 
    if(v.getId() == R.id.addButton){ 
     addItem(); 
    } 
} 
} 

而且繼承人,顯示內容的課,在那裏我可以使用Addfood類:

package com.example.mappe3; 

public class DatabaseActivity extends Activity { 

private HousekeepingDBHelper hkDBhelper; 
private HousekeepingCursorAdapter hkCursorA; 
private static final int ENTER_DATA_REQUEST_CODE = 1; 

private ListView foodList; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_database); 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    hkDBhelper = new HousekeepingDBHelper(this); 
    foodList = (ListView)findViewById(R.id.food_data); 

    runner(); 
} 

public void runner(){ 
    new Handler().post(new Runnable(){ 
     @Override 
     public void run(){ 
      hkCursorA = new HousekeepingCursorAdapter(DatabaseActivity.this, hkDBhelper.listAll()); 
      foodList.setAdapter(hkCursorA); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int reqCode, int resCode, Intent data){ 
    super.onActivityResult(reqCode, resCode, data); 

    if(reqCode == ENTER_DATA_REQUEST_CODE && resCode == RESULT_OK){ 
     hkDBhelper.addItem(data.getExtras().getString("tag_grocery_foodItem"), 
          data.getExtras().getString("tag_grocery_weight"), 
          data.getExtras().getString("tag_grocery_price"), 
          data.getExtras().getString("tag_grocery_brand"), 
          data.getExtras().getString("tag_grocery_category")); 
     hkCursorA.changeCursor(hkDBhelper.listAll()); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.database, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     NavUtils.navigateUpFromSameTask(this); 
     return true; 
    case R.id.addItem: 
     startActivityForResult(new Intent(this, AddFood.class), ENTER_DATA_REQUEST_CODE); 
     return true;    
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

當我在做我的AddFood類運行完成的字段填寫();並轉到之前的活動(DatabaseActivity),我可以在列表中選擇新對象。

這是我的MainActivity.java。這是我遇到麻煩的地方。

package com.example.mappe3; 

public class MainActivity extends Activity implements OnClickListener{ 

private Button databaseB; 
private static final int ENTER_DATA_REQUEST_CODE = 1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    databaseB = (Button)findViewById(R.id.food_db_button); 
    databaseB.setOnClickListener(this); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

//THIS IS WHAT I THOUGT WAS ENOUGH TO DO THE SAME THING IN THIS CLASS 
    if (id == R.id.addItem) { 
     startActivityForResult(new Intent(this, AddFood.class), ENTER_DATA_REQUEST_CODE); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onClick(View v) { 
    if(v.getId() == R.id.food_db_button){ 
     Intent startIntent = new Intent(this, DatabaseActivity.class); 
     this.startActivityForResult(startIntent, 1); 
    } 

} 
} 

Im完成從MainActivity添加AddFood類後,它返回到MainActivity,這是我想要的。但是,當我打開DatabaseActivity去尋找它時,它不在那裏。我仍然可以看到從其他課程添加的所有項目,但不是我剛剛添加的項目。

希望我的解釋對任何人都有意義。

有人可以看到我在做什麼錯嗎?

編輯:onActivityResult()在MainActivity

@Override 
protected void onActivityResult(int reqCode, int resCode, Intent data){ 
    super.onActivityResult(reqCode, resCode, data); 

    if(reqCode == ENTER_DATA_REQUEST_CODE && resCode == RESULT_OK){ 
     hkDBhelper.addItem(data.getExtras().getString("tag_grocery_foodItem"), 
          data.getExtras().getString("tag_grocery_weight"), 
          data.getExtras().getString("tag_grocery_price"), 
          data.getExtras().getString("tag_grocery_brand"), 
          data.getExtras().getString("tag_grocery_category")); 
     hkCursorA.changeCursor(hkDBhelper.listAll()); 
    } 
} 

錯誤日誌:

10-29 11:13:29.538: E/AndroidRuntime(28521): FATAL EXCEPTION: main 
10-29 11:13:29.538: E/AndroidRuntime(28521): Process: com.example.s188094_mappe3, PID: 28521 
10-29 11:13:29.538: E/AndroidRuntime(28521): java.lang.RuntimeException: Failure delivering result 
ResultInfo{who=null, request=1, result=-1, data=Intent { cmp=com.example.s188094_mappe3/.AddFood 
(has extras) }} to activity {com.example.s188094_mappe3/com.example.s188094_mappe3.MainActivity}: 
java.lang.NullPointerException 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
android.app.ActivityThread.deliverResults(ActivityThread.java:3928) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
android.app.ActivityThread.handleSendResult(ActivityThread.java:3978) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
android.app.ActivityThread.access$1300(ActivityThread.java:156) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
android.os.Handler.dispatchMessage(Handler.java:102) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at android.os.Looper.loop(Looper.java:157) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
android.app.ActivityThread.main(ActivityThread.java:5867) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at java.lang.reflect.Method.invokeNative(Native 
Method) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at java.lang.reflect.Method.invoke(Method.java:515) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at dalvik.system.NativeStart.main(Native Method) 
10-29 11:13:29.538: E/AndroidRuntime(28521): Caused by: java.lang.NullPointerException 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
com.example.s188094_mappe3.MainActivity.onActivityResult(MainActivity.java:40) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
android.app.Activity.dispatchActivityResult(Activity.java:5535) 
10-29 11:13:29.538: E/AndroidRuntime(28521): at 
android.app.ActivityThread.deliverResults(ActivityThread.java:3924) 
10-29 11:13:29.538: E/AndroidRuntime(28521): ... 11 more 

回答

0

在你AddFood類創建一個Intent並用數據填充它,那麼這個Intent傳遞迴開始的活動AddFood。如果AddFoodDatabaseActivity開始,則使用返回的Intent將項目添加到數據庫onActivityResult()中。

但是,如果AddFoodMainActivity開始,沒有什麼與返回Intent這樣做,因爲你已經不是在MainActivity實施onActivityResult()

+0

嗯。我明白。非常好的解釋。那麼,我嘗試將onActivityResult()添加到MainActivity,現在我得到了這個錯誤:失敗,提供結果ResultInfo {who = null,request = 1,result = -1,data = Intent {cmp = com.example.s188094_mappe3 /。 AddFood(有額外)}}任何想法? – 2014-10-29 08:05:27

+0

日誌中必須有更多。 Stacktrace會有幫助。請在你的問題中發佈你的MainActivity.onActivityResult()的實現和包括stacktrace的logcat錯誤。 – 2014-10-29 10:06:09

+0

不要試圖將其作爲評論發佈。只需編輯您的問題並在底部添加此信息 – 2014-10-29 10:06:50

相關問題