安卓SQLite异常:没有这样的列_ingredients - java

我在尝试获取存储在数据库中的信息并将其显示在ListView中时遇到了一些麻烦。
当我启动应用程序时,它崩溃了。

我的主要活动:

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();
    setupDatabase();
    addObject();


}

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


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) {
            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);
        //byte[] imageBytes = getBytes(image);
        ListItem newObject = new ListItem(name,kategory,ingredients,directions, image);
        //itemList.add(newObject);
        receptDB.insertReceptItem(newObject);
        refreshListView();
    }
}
    private void refreshListView() {
    Cursor cursor = receptDB.getAllRows();
    String[] fromFieldNames = new String[] {DatabaseAdapter.KEY_NAME, DatabaseAdapter.KEY_KATEGORY};
    int[] toViewIDs = new int[] {R.id.receptName, R.id.kategory};
    SimpleCursorAdapter myCursorAdapter;
    myCursorAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.activity_list_item, cursor, fromFieldNames, toViewIDs, 0);
    ListView myList = (ListView) findViewById(R.id.listItem);
    myList.setAdapter(myCursorAdapter);
}

@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();
}

数据库:

公共类DatabaseAdapter {

private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "receptlist.db";
private static final int DATABASE_VERSION = 2;

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 = "directions";
//bitmap?

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;

public static final String[] ALL_KEYS = new String[] {KEY_ID, KEY_NAME, KEY_KATEGORY, KEY_INGREDIENTS, KEY_DIRECTIONS};

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);";

private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;

public DatabaseAdapter(Context context) {
    this.context = context;
    DBHelper = new DatabaseHelper(context);
}

public DatabaseAdapter open(){
    db = DBHelper.getWritableDatabase();
    return this;
}

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

//Neue Liste von Daten in Datenbank
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());

    //Speichern in die Datenbank
    return db.insert(DATABASE_TABLE, null, itemValues);
}

//Löschen eines Items durch den primary Key
public boolean deleteItem(long itemID){
    String where = KEY_ID + "=" + itemID;
    return db.delete(DATABASE_TABLE, where, null) != 0;
}

public void deleteAll() {
    Cursor c = getAllRows();
    long rowId = c.getColumnIndexOrThrow(KEY_ID);
    if (c.moveToFirst()) {
        do {
            deleteItem(c.getLong((int) rowId));
        } while (c.moveToNext());
    }
    c.close();
}

//Zurückgeben aller Daten in der Datenbank
public Cursor getAllRows(){
    String where = null;
    Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, where, null,null,null,null,null);
    if (c != null) c.moveToFirst();
    return c;
}

//Auf bestimmte Reihe zugreifen
public Cursor getRow(long rowId){
    String where = KEY_ID + "=" + rowId;
    Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, where, null,null,null,null,null);
    if (c != null) c.moveToFirst();
    return c;
}

private static class DatabaseHelper extends SQLiteOpenHelper{

    DatabaseHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

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

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

    }

}

Logcat:

08-12 16:41:11.161 20386-20386/de.ur.mi.android.excercises.starter E/SQLiteLog: (1) no such column: ingredients
08-12 16:41:11.163 20386-20386/de.ur.mi.android.excercises.starter D/AndroidRuntime: Shutting down VM
08-12 16:41:11.164 20386-20386/de.ur.mi.android.excercises.starter E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                     Process: de.ur.mi.android.excercises.starter, PID: 20386
                                                                                     java.lang.RuntimeException: Unable to start activity ComponentInfo{de.ur.mi.android.excercises.starter/de.ur.mi.android.excercises.starter.List_Page}: android.database.sqlite.SQLiteException: no such column: ingredients (code 1): , while compiling: SELECT DISTINCT _id, name, kategory, ingredients, directions FROM receptlistitems
                                                                                         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: android.database.sqlite.SQLiteException: no such column: ingredients (code 1): , while compiling: SELECT DISTINCT _id, name, kategory, ingredients, directions FROM receptlistitems
                                                                                         at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                                         at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:895)
                                                                                         at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:506)
                                                                                         at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                                                         at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                                         at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                                                                                         at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                                                                                         at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1318)
                                                                                         at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1165)
                                                                                         at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1036)
                                                                                         at de.ur.mi.android.excercises.starter.DatabaseAdapter.getAllRows(DatabaseAdapter.java:96)
                                                                                         at de.ur.mi.android.excercises.starter.List_Page.refreshListView(List_Page.java:109)
                                                                                         at de.ur.mi.android.excercises.starter.List_Page.setupDatabase(List_Page.java:51)
                                                                                         at de.ur.mi.android.excercises.starter.List_Page.onCreate(List_Page.java:42)
                                                                                         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) 

提前致谢!

参考方案

如果更改数据库模式中的任何内容(例如添加列),则必须增加SQLiteOpenHelper中的数据库版本。如果增加版本的值,您将获得onUpgrade的回调,并且必须在那里处理该数据库更改。

private static class DatabaseHelper extends SQLiteOpenHelper{

    DatabaseHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION); // increased version
    }

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

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         // Either add the column, or drop and create the table again. 
    }

}

或者简单的解决方案是卸载并重新安装该应用程序。

单击后退按钮时,滑行加载的图像会重置 - java

我正在滑行加载图像。但是问题是,当我们按下后退按钮时,从视图中清除加载的图像。无论我在活动图像视图中还是在recyclerview中加载图像,我都面临着这个问题。我正在加载图像GlideApp.with(this) .load(url) .into(mToolbarAvatar); 参考方案 在代码中添加两行.skipMemoryCache(true) .d…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…