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