2017-08-12 79 views
-1

我可以打开我的Datenbase,但如果我尝试插入项目我的应用程序崩溃。 只将项目插入到我的ListView中。我试图插入一个项目到我的数据库后,我的应用程序崩溃

我在另一个活动中创建一个新的对象,并采取意图中的值。 但是,当我开始意图,并返回到主/ List_page活动我的应用程序崩溃。没有数据库,应用程序就会运行。

我的继承人代码:ReceptListAdapter.java:

public class ReceptListDatabase { 

private static final String DATABASE_NAME = "receptlist.db"; 
private static final int DATABASE_VERSION = 1; 

private static final String DATABASE_TABLE = "receptlistitems"; 

public static final String KEY_ID = "_id"; 
public static final String KEY_NAME = "name"; 
public static final String KEY_KATEGORY = "kategory"; 
public static final String KEY_INGREDIENTS = "ingredients"; 
public static final String KEY_DIRECTIONS = "ingredients"; 


public static final int COLUMN_NAME_INDEX = 1; 
public static final int COLUMN_KATEGORY_INDEX = 2; 
public static final int COLUMN_INGREDIENTS_INDEX = 3; 
public static final int COLUMN_DIRECTIONS_INDEX = 4; 

private ReceptDBOpenHelper dbHelper; 

private SQLiteDatabase DB; 

public ReceptListDatabase(Context context) { 
    dbHelper = new ReceptDBOpenHelper(context, DATABASE_NAME, null, 
      DATABASE_VERSION); 
} 

public void open() throws SQLException { 
    try { 
     db = dbHelper.getWritableDatabase(); 
    } catch (SQLException e) { 
     db = dbHelper.getReadableDatabase(); 
    } 
} 

public void close() { 
    db.close(); 
} 

public long insertReceptItem(ListItem item) { 
    ContentValues itemValues = new ContentValues(); 
    itemValues.put(KEY_NAME, item.getName()); 
    itemValues.put(KEY_KATEGORY,item.getKategory()); 
    itemValues.put(KEY_INGREDIENTS, item.getIngredients()); 
    itemValues.put(KEY_DIRECTIONS, item.getDirection()); 
    return db.insert(DATABASE_TABLE, null, itemValues); 
} 

public void removeReceptItem(ListItem item) { 

    String toDelete = KEY_NAME + "=?"; 
    String[] deleteArguments = new String[]{item.getName()}; 
    db.delete(DATABASE_TABLE, toDelete, deleteArguments); 

} 

public ArrayList<ListItem> getAllReceptItems() { 
    ArrayList<ListItem> items = new ArrayList<ListItem>(); 
    Cursor cursor = db.query(DATABASE_TABLE, new String[] { KEY_ID, 
      KEY_NAME, KEY_KATEGORY, KEY_INGREDIENTS, KEY_DIRECTIONS, null}, null, null, null, null, null); 
    if (cursor.moveToFirst()) { 
     do { 
      String name = cursor.getString(COLUMN_NAME_INDEX); 
      String kategory = cursor.getString(COLUMN_KATEGORY_INDEX); 
      String ingredients = cursor.getString(COLUMN_INGREDIENTS_INDEX); 
      String directions = cursor.getString(COLUMN_DIRECTIONS_INDEX); 

      items.add(new ListItem(name, kategory, ingredients, directions, null)); 

     } while (cursor.moveToNext()); 
    } 
    return items; 
} 

private class ReceptDBOpenHelper extends SQLiteOpenHelper { 
    private static final String DATABASE_CREATE = "create table " 
      + DATABASE_TABLE + " (" + KEY_ID 
      + " integer primary key autoincrement, " + KEY_NAME 
      + " text not null, " + KEY_KATEGORY 
      + " text, " + KEY_INGREDIENTS 
      + " text not null, " + KEY_DIRECTIONS 
      + " text not null);"; 


     public ReceptDBOpenHelper(Context c, String dbname, 
          SQLiteDatabase.CursorFactory factory, int version) { 
     super(c, dbname, factory, version); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(DATABASE_CREATE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 
} 

而我的主要活动:

public class List_Page extends Activity { 


private ListViewAdapter adapter; 
private ArrayList<ListItem> itemList; 
private ListView list; 
private DatabaseAdapter receptDB; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list); 
    setupButton(); 
    setupListView(); 
    addObject(); 
    setupDatabase(); 

} 

private void setupDatabase() { 
    receptDB = new DatabaseAdapter(this); 
    receptDB.open(); 
} 


private void setupButton() { 
    Button addItemButton = (Button) findViewById(R.id.addItemButton); 
    addItemButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      buttonClicked(); 
     } 
    }); 
} 

private void buttonClicked() { 
    //get EditText 
    Intent newItemIntent = new Intent(List_Page.this, Add_Object.class); 
    startActivity(newItemIntent); 
    finish(); 
} 

private void setupListView() { 
    itemList = new ArrayList<ListItem>(); 
    adapter = new ListViewAdapter(List_Page.this, itemList); 
    list = (ListView) findViewById(R.id.listItem); 
    list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, 
             int position, long id) { 
      //fehler bei removeTaskAtPosition(position); 
      return true; 
     } 
    }); 
    View header = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.activity_list_item, null); 
    list.addHeaderView(header); 
    list.setAdapter(adapter); 

} 

private void addObject(){ 
    Intent intent = getIntent(); 
    if (intent.hasExtra(Constants.KEY_RECEPT_NAME)) { 
     String name = intent.getExtras().getString(Constants.KEY_RECEPT_NAME); 
     String kategory = intent.getExtras().getString(Constants.KEY_KATEGORY); 
     String ingredients = intent.getExtras().getString(Constants.KEY_INGREDIENTS); 
     String directions = intent.getExtras().getString(Constants.KEY_DIRECTIONS); 
     Bitmap image = (Bitmap) intent.getParcelableExtra(Constants.KEY_IMAGE); 
     ListItem newObject = new ListItem(name,kategory,ingredients,directions, image); 
     itemList.add(newObject); 
     receptDB.insertReceptItem(newObject); 
     //refreshArrayList(); 
    } 
} 

    private void refreshArrayList() { 
    ArrayList tempList = receptDB.getAllReceptItems(); 
    itemList.clear(); 
    itemList.addAll(tempList); 
    adapter.notifyDataSetChanged(); 
} 

private void removeTaskAtPosition(int position) { 
    if (itemList.get(position) != null) { 
     receptDB.removeReceptItem(itemList.get(position)); 
     refreshArrayList(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    receptDB.close(); 
} 

} 

的logcat:

08-12 15:37:00.743 22879-22879/de.ur.mi.android.excercises.starter E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: de.ur.mi.android.excercises.starter, PID: 22879 
                        java.lang.RuntimeException: Unable to start activity ComponentInfo{de.ur.mi.android.excercises.starter/de.ur.mi.android.excercises.starter.List_Page}: java.lang.NullPointerException: Attempt to invoke virtual method 'long de.ur.mi.android.excercises.starter.DatabaseAdapter.insertReceptItem(de.ur.mi.android.excercises.starter.domain.ListItem)' on a null object reference 
                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2720) 
                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2781) 
                         at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1508) 
                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                         at android.os.Looper.loop(Looper.java:241) 
                         at android.app.ActivityThread.main(ActivityThread.java:6274) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
                         Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'long de.ur.mi.android.excercises.starter.DatabaseAdapter.insertReceptItem(de.ur.mi.android.excercises.starter.domain.ListItem)' on a null object reference 
                         at de.ur.mi.android.excercises.starter.List_Page.addObject(List_Page.java:99) 
                         at de.ur.mi.android.excercises.starter.List_Page.onCreate(List_Page.java:40) 
                         at android.app.Activity.performCreate(Activity.java:6720) 
                         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 
                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2673) 
                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2781)  
                         at android.app.ActivityThread.-wrap12(ActivityThread.java)  
                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1508)  
                         at android.os.Handler.dispatchMessage(Handler.java:102)  
                         at android.os.Looper.loop(Looper.java:241)  
                         at android.app.ActivityThread.main(ActivityThread.java:6274)  
                         at java.lang.reflect.Method.invoke(Native Method)  
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  
+2

请发表您的崩溃日志。 – Bob

+0

https://stackoverflow.com/questions/23353173/uncomfort-myapp-has-stopped-how-can-i-solve-this/23353174#23353174 –

回答

0

在你ActivityonCreate您所呼叫addObject()然后致电setupDatabase()。只有在setupDatabase()里面你正在初始化receptDB实例。

但是您正在访问receptDb里面的addObject()方法。

receptDB.insertReceptItem(newObject); 
那段时间

所以,你receptDB有空引用,所以你越来越NullPointerException

所以交换以下两行从,

addObject(); 
setupDatabase(); 

这样:

setupDatabase(); 
addObject(); 
+0

哦,我很蠢..谢谢! –

相关问题