Java 插入SQLite时没有这样的表错误

Java 插入SQLite时没有这样的表错误,java,android,sqlite,Java,Android,Sqlite,这是我的日志: 08-10 23:11:01.644 2341-2341/com.projects.learnwords.app E/Database﹕ 插入错误>正确的英语单词=0秒单词=Сббаа正确的俄语单词=0第一个单词=狗 android.database.sqlite.SQLiteException:没有这样的表:vv:,编译时:插入到 vv(正确的英语单词,第二个单词,正确的俄语单词,第一个单词)值(?,,,>) 我的数据库类: public class DbControl {

这是我的日志:

08-10 23:11:01.644 2341-2341/com.projects.learnwords.app E/Database﹕ 插入错误>正确的英语单词=0秒单词=Сббаа正确的俄语单词=0第一个单词=狗 android.database.sqlite.SQLiteException:没有这样的表:vv:,编译时:插入到 vv(正确的英语单词,第二个单词,正确的俄语单词,第一个单词)值(?,,,>)

我的数据库类:

public class DbControl {
    private static final String DB_NAME = "LearnWordsDB.db";
    private final String TABLE_NAME;
    private final int DB_VERSION;

    static final String FIRST_WORD = "FIRST_WORD";
    static final String SECOND_WORD = "SECOND_WORD";
    static final String CORRECT_FIRST_WORDS = "CORRECT_ENGLISH_WORDS";
    static final String CORRECT_SECOND_WORDS = "CORRECT_RUSSIANS_WORDS";

    private Cursor cursor;
    private SQLiteDatabase database;
    private DbOpenHelper dbOpenHelper;
    private Context context;

public DbControl(Context context, final String TABLE_NAME, int DB_VERSION){
    super();
    this.context = context;
    this.TABLE_NAME = TABLE_NAME;
    this.DB_VERSION =DB_VERSION;
}

public void open() throws SQLException {
    dbOpenHelper = new DbOpenHelper(context, DB_NAME, null, DB_VERSION);
    database = dbOpenHelper.getWritableDatabase();
}

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

public void insert(final String FIRST_WORD, final String SECOND_WORD,
                   final int CORRECT_FIRST_WORDS, final int CORRECT_SECOND_WORDS) {

    ContentValues values = new ContentValues();

    values.put(Dictionary.FIRST_WORD, FIRST_WORD);
    values.put(Dictionary.SECOND_WORD, SECOND_WORD);
    values.put(Dictionary.CORRECT_FIRST_WORDS, CORRECT_FIRST_WORDS);
    values.put(Dictionary.CORRECT_SECOND_WORDS, CORRECT_SECOND_WORDS);

    database.insert(TABLE_NAME, null, values);
}

private class DbOpenHelper extends SQLiteOpenHelper{

    public DbOpenHelper(Context context, final String DB_NAME, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, DB_NAME, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " ( _id INTEGER PRIMARY KEY AUTOINCREMENT, " + FIRST_WORD + " TEXT, " +
                SECOND_WORD + " TEXT, " + CORRECT_FIRST_WORDS + " INTEGER, " + CORRECT_SECOND_WORDS + " INTEGER )";
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;
        db.execSQL(DROP_TABLE);
        onCreate(db);
    }
  }
}
在这里,我试图插入:

private void writeToDictionary(String contents, String dictName){

    DbControl dict = new DbControl(getApplicationContext(), dictName, 1);
    DictionaryRow[] dictRows = parseWords(contents);
    try {
        dict.open();
        for(DictionaryRow dr: dictRows) {
                dict.insert(dr.getFirstWord(), dr.getSecondWord(), dr.getCorrectFirstWords(), dr.getCorrectSecondWords());
        }
    } catch (SQLException e)
    {
        Log.e("CREATE_OR_OPEN_ERROR", e.toString());
        Toast.makeText(getApplicationContext(), "Ошибка", Toast.LENGTH_LONG).show();
    }
}
我的手机API 10级。
如何解决此问题?

我认为问题在于您将表名作为构造函数的参数,希望它在打开现有数据库时创建此新表,而这将不起作用。您应该在
onCreate
中初始化所有需要的表,因为每个数据库只发生一次


有鉴于此,我认为您不应该拥有该构造函数参数,也不应该在每次调用
open()
时创建
DbHelper
的新实例。我可能会更进一步,将
DbControl
作为一个单例,它只包装
DbHelper
并公开您创建的方法。

创建表(
vv
)和/或使用正确的表名。错误消息说明了问题所在:不要怀疑。我认为当我调用getWritableDatabase()方法时,表正在创建,不是吗?不,不总是;只有当您试图打开数据库时,该数据库还不存在,这意味着它是第一次创建的。我认为问题在于您将表名作为构造函数的参数,希望它在打开现有数据库时创建这个新表,而这将不起作用。您应该在
onCreate
中初始化所有需要的表,因为每个数据库只发生一次。给定than,我认为您不应该拥有该构造函数参数,也不应该在每次调用
open()
时创建
DbHelper
的新实例。当您使用DbHelper时,它可能会出现,但您的代码看起来不完整。我甚至没有在插入中看到“vv”,更不用说onCreate了