我正在尝试向我的SQLite数据库添加一个密钥,但是当我尝试访问新列时,程序会抛出"没有这样的列类型(代码1)"。我在SQLite编辑器中验证了新列实际存在。我错过了什么吗?
解决方案 我的数据库创建没有接受DATABASE_VERSION,我只是将其设置为使用" 1"。一旦我将其设置为使用该变量,并将其从1更改为2,它就更新了我的数据库!
这是我的班级
package com.example.blizz_000.lureorganizer;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.sql.SQLException;
public class LureOrganizer {
public com.example.blizz_000.lureorganizer.DatabaseHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;
public static final String KEY_NAME = "model";
public static final String KEY_MAKER = "company";
public static final String KEY_SIZE = "size";
public static final String KEY_COLOR = "color";
public static final String KEY_TYPE = "TEST";
public static final String KEY_ROWID = "_id";
private static final String DATABASE_NAME = "fishing_db";
private static final String DATABASE_TABLE = "LURES";
public static int DATABASE_VERSION = 1;
// DATABASE HELPER CLASS*********************************************************
private static class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + DATABASE_TABLE +" (" +
KEY_ROWID +"INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_NAME + " TEXT, " +
KEY_MAKER + " TEXT, " +
KEY_COLOR + " TEXT, " +
"TEST text, " +
KEY_SIZE + " TEXT);");
//db.execSQL("ALTER TABLE LURES ADD COLUMN TEST TEST"); // Won't find the table
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
onCreate(db);
}
}
// END DATABASE HELPER CLASS *********************************************************
//*********************BEGIN MY METHODS**************************
public LureOrganizer(Context c) {
ourContext = c;}
//Opens Db
public LureOrganizer open() throws SQLException{
ourHelper = new com.example.blizz_000.lureorganizer.DatabaseHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;}
//Opens Db NO EXCEPTION
public LureOrganizer opennoe() {
ourHelper = new com.example.blizz_000.lureorganizer.DatabaseHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;}
//Closes Db
public void close() {
ourHelper.close();}
//Entries
public long createEntry(String name, String maker, String color, String size, String type) {
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, name);
cv.put(KEY_MAKER, maker);
cv.put(KEY_COLOR, color);
cv.put(KEY_SIZE, size);
cv.put(KEY_TYPE, type);
return ourDatabase.insert(DATABASE_TABLE, null, cv);}
//RETRIEVE ALL PIECES OF THE DATA *****************************************************************************************************//
//Retrive Data for SINGLE PIECE
public String[] getData(String id) {
String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_MAKER, KEY_COLOR, KEY_SIZE};
Cursor d = ourDatabase.rawQuery("select * from LURES WHERE _id = ?",
new String[]{id});
String[] resultarray = new String[5];
int iName = d.getColumnIndex(KEY_NAME);
int iMaker = d.getColumnIndex(KEY_MAKER);
int iColor = d.getColumnIndex(KEY_COLOR);
int iSize = d.getColumnIndex(KEY_SIZE);
int iType = d.getColumnIndex(KEY_TYPE);
for (d.moveToFirst(); !d.isAfterLast(); d.moveToNext()) {
resultarray[0] = d.getString(iMaker);
resultarray[1] = d.getString(iName);
resultarray[2] = d.getString(iColor);
resultarray[3] = d.getString(iSize);
resultarray[4] = d.getString(iType);
}
return resultarray;
}
//Retrieve Data
public String[] getName() {
String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_MAKER, KEY_COLOR, KEY_SIZE, KEY_TYPE};
Cursor d = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result ="";
String[] resultarray = new String[5];
int iRow = d.getColumnIndex(KEY_ROWID);
int iName = d.getColumnIndex(KEY_NAME);
int iMaker = d.getColumnIndex(KEY_MAKER);
int iColor = d.getColumnIndex(KEY_COLOR);
int iSize = d.getColumnIndex(KEY_SIZE);
int iType = d.getColumnIndex(KEY_TYPE);
for(d.moveToFirst(); !d.isAfterLast(); d.moveToNext()){
resultarray[0] = d.getString(iMaker);
resultarray[1] = d.getString(iName);
resultarray[2] = d.getString(iColor);
resultarray[3] = d.getString(iSize);
resultarray[4] = d.getString(iType);
}
return resultarray;
}
//CURSOR READER
public Cursor readEntry() {
String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_MAKER, KEY_COLOR, KEY_SIZE, KEY_TYPE};
Cursor d = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
return d;
}
public void DeleteRow(String id) {
ourDatabase.delete(DATABASE_TABLE, "_id = ?",
new String[]{id});
}
}
我知道代码的工作方式不是KEY_TYPE,所以我觉得有必要包含其他类,但如果有帮助的话,我会的。
答案 0 :(得分:1)
每当你创建数据库打开助手的对象时,它都不会调用该类的onCreate。只有当你第一次调用getWritableDatabse()或getReadableDatabase()时,它才会调用,如果你的应用程序中不存在数据库文件。为什么我这样说是因为你在那边写了一些修改命令。
如果在没有卸载的情况下运行应用程序,那么数据库文件将不会被删除,因此它不会调用该类的oncreate。
在编写与数据库相关的代码时更好地卸载并运行应用程序。
你在id coloumn之后错过了一个空格。
db.execSQL("CREATE TABLE " + DATABASE_TABLE +" (" +
KEY_ROWID +" INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_NAME + " TEXT, " +
KEY_MAKER + " TEXT, " +
KEY_COLOR + " TEXT, " +
"TEST text, " +
KEY_SIZE + " TEXT);");
我希望这会对你有所帮助。
答案 1 :(得分:1)
当您更改数据库结构(即:更改表)时,您必须通知它您的数据库已更改。
这是通过将 DATABASE_VERSION 常量设置为更高的值来完成的,即: 2 。
所以:
public static int DATABASE_VERSION = 2;
这将使onUpgrade()
方法触发并重新创建表。
你在KEY_ROWID之后错过了一个空格:
db.execSQL("CREATE TABLE " + DATABASE_TABLE +" (" +
KEY_ROWID +" INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_NAME + " TEXT, " + KEY_MAKER + " TEXT, " +
KEY_COLOR + " TEXT, " + "TEST text, " + KEY_SIZE + " TEXT)");