2014-10-28 2 views
0

Я получил эту активность AddFood, от кого я могу добавлять объекты в свою базу данных. Когда я открываю действие из одного класса (класс, который впоследствии показывает базу данных в списке), все работает нормально.Добавление в базу данных 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(); 
    } 
} 
} 

И Heres класс, который показывает содержание, и где я могу использовать 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 Добавив в классе AddFood от MainActivity она восходит к MainActivity, которым является то, что я хочу. Но тогда, когда я открываю DatabaseActivity, чтобы искать его, его нет. Я все еще вижу все элементы, добавленные из другого класса, но не тот, который я только что добавил.

Надеюсь, что мое объяснение имеет смысл для всех.

Может ли кто-нибудь увидеть, что я делаю неправильно?

Edit: 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. Если AddFood запущен с DatabaseActivity, то возвращаемый Intent используется для добавления элемента в базу данных в onActivityResult().

Однако, если AddFood запускается из MainActivity, ничего не делается с возвращенным Intent, потому что вы не реализовали onActivityResult() в MainActivity.

+0

Хм. Я понимаю. Очень хорошее объяснение. Ну, я попробовал добавить onActivityResult() в MainActivity, и теперь я получил эту ошибку: Failure delivering result ResultInfo {who = null, request = 1, result = -1, data = Intent {cmp = com.example.s188094_mappe3 /. AddFood (есть дополнительные функции)}} Какие-нибудь идеи? –

+0

В журнале должно быть больше. Stacktrace был бы полезен. Пожалуйста, опубликуйте свою реализацию 'MainActivity.onActivityResult()' и ошибки logcat, включая stacktrace в вашем вопросе. –

+0

Не пытайтесь опубликовать это как комментарий. просто отредактируйте свой вопрос и добавьте эту информацию внизу –

Смежные вопросы