简体   繁体   English

Android SQLite表不存在

[英]Android SQLite table does not exist

I am trying to create and insert rows in an SQLite table. 我正在尝试在SQLite表中创建和插入行。 However, I get an error when inserting the rows that the table does not exist. 但是,插入表不存在的行时出现错误。 Can anyone tell me what I am doing wrong here? 谁能告诉我我在做什么错? Thanks! 谢谢!

The code in the activity that is calling the class to create the database and insert rows is as follows: 活动中调用该类以创建数据库并插入行的代码如下:

    // Open database
    db = new DBAdapter(this);
    db.open();

    // TODO: insertRecept statements hieronder verwijderen
    // Dienen enkel voor test om inhoud te hebben
    long id = db.insertRecept("aardappelen - bloemkool - kotelet");
    id = db.insertRecept("rijst - wokgroenten - scampi - currysaus");
    id = db.insertRecept("nasi goreng - omelet");
    id = db.insertRecept("ebly - veggieburger - provencaalse saus");
    id = db.insertRecept("rijst - kipfilet - zoetzure saus");
    id = db.insertRecept("ebly - veggieburger - provencaalse saus");
    id = db.insertRecept("puree - fish-sticks - spinazie");
    id = db.insertRecept("tortellini - kaassaus");
    id = db.insertRecept("aardappelen - bloemkool - chippolata");
    id = db.insertRecept("pizza");
    id = db.insertRecept("frietjes");
    id = db.insertRecept("aardappel - zalm - prei - melksaus");
    db.close();

The DBAdapter class is as follows: DBAdapter类如下:

package be.bertcarremans.weekmenu;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.sql.SQLException;

public class DBAdapter {
static final String KEY_ROWID = "_id";
static final String KEY_RECEPT_TITEL = "recept_titel";
static final String TAG = "DBAdapter";

static final String DATABASE_NAME = "recepten_db";
static final String DATABASE_TABLE = "recepten";
static final int DATABASE_VERSION = 1;

static final String DATABASE_CREATE =
        "CREATE TABLE recepten (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
        + "recept_titel  TEXT NOT NULL);";

DatabaseHelper DBHelper;
SQLiteDatabase db;

final Context context;

// Constructor
public DBAdapter(Context ctx) {
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

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) {
        db.execSQL("DROP TABLE IF EXISTS recepten");
    }
}

// database openen
public DBAdapter open() {
    db = DBHelper.getWritableDatabase();
    return this;
}

// database sluiten
public void close() {
    DBHelper.close();
}

// recept toevoegen
public long insertRecept(String recept) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_RECEPT_TITEL, recept);
    return db.insert(DATABASE_TABLE, null, initialValues);
}
}

It looks you most likely have changed the schema structure, and (most likely) bumped version number of your database. 您似乎最有可能更改了架构结构,并且(很可能)更改了数据库的版本号。 This, in conjunction with broken onUpgrade() implementation caused your problems. 这与损坏的onUpgrade()实现一起导致了您的问题。

As a quick solution: uninstall the app and install again - this will completely wipe the database and make your app create it on 1st run. 快速解决方案:卸载应用程序并重新安装-这将完全擦除数据库,并使您的应用程序在第一次运行时创建它。 But as a long term solution, you need to fix onUpgrade() . 但是作为长期解决方案,您需要修复onUpgrade() Right now you do this: 现在,您可以执行以下操作:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS recepten");
}

so in human language it reads: "when we need to upgrade, just wipe the table". 因此,用人类语言写成:“当我们需要升级时,只需擦拭桌子即可”。 What about re-creating it after that? 那之后重新创建呢? If you won't do that, you got no table. 如果您不这样做,那您就没有桌子。 If you got no plans to have update code, then I'd move my table removal/creation code to (respectively) ie createTables() / removeTables() methods and just make my onUpgrade() use it: 如果您没有计划使用更新代码,那么我将分别将表删除/创建代码移动到(即) createTables() / removeTables()方法,并仅使onUpgrade()使用它:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    removeTables(db);
    createTables(db);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM