Java 在我尝试将项目插入数据库后,我的应用程序崩溃
我可以打开我的Datenbase,但如果我试图插入一个项目,我的应用程序就会崩溃。 仅将项目插入到我的ListView工作 我在另一个活动中创建一个新对象,并在意图中获取值。 但当我启动intent并返回到主/列表页面活动时,我的应用程序崩溃。如果没有数据库,应用程序将运行 以下是我的代码:recepltListAdapter.java:Java 在我尝试将项目插入数据库后,我的应用程序崩溃,java,android,database,listview,nullpointerexception,Java,Android,Database,Listview,Nullpointerexception,我可以打开我的Datenbase,但如果我试图插入一个项目,我的应用程序就会崩溃。 仅将项目插入到我的ListView工作 我在另一个活动中创建一个新对象,并在意图中获取值。 但当我启动intent并返回到主/列表页面活动时,我的应用程序崩溃。如果没有数据库,应用程序将运行 以下是我的代码:recepltListAdapter.java: public class ReceptListDatabase { private static final String DATABASE_NAME =
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) {
}
}
在
活动
的onCreate
中,在调用setupDatabase()
之前,您正在调用addObject()
。仅在setupDatabase()
内,您正在初始化receptDB
实例
但是您正在访问receptDb
内部的addObject()
方法
receptDB.insertReceptItem(newObject);
因此在此期间,您的receptDB
具有空引用,因此您将获得NullPointerException
把下面两行从
addObject();
setupDatabase();
为此:
setupDatabase();
addObject();
请把你的失事日志贴出来。哦,我太蠢了。。非常感谢。
addObject();
setupDatabase();
setupDatabase();
addObject();