正在努力连接我的SQLitedbandroidstudio,表中并没有可插入的列



所以我正在尝试设置我的SQLite数据库,但我收到了一些错误,我发现这些错误很难纠正。请参阅此处的错误日志

有一个抛出错误的图像,这是我为DatabaseHelper 设置的代码

我在日志中也收到了一些其他错误,我不确定它们与什么有关——任何信息都很棒请参阅此处的logcat输出

错误代码无论如何

E/SQLiteLog: (1) table my_manager has no column named 
location_description in "INSERT INTO my_manager(location_name,location_county,location_description) 
VALUES (?,?,?)"
2020-11-28 19:56:32.986 5665-5665/? E/SQLiteDatabase: Error inserting location_name=Blarney Stone 
location_county=Cork location_description=Stone in  big wall
android.database.sqlite.SQLiteException: table my_manager has no column named location_description 
(code 1 SQLITE_ERROR): , while compiling: INSERT INTO 
my_manager(location_name,location_county,location_description) VALUES (?,?,?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1045)
a....

这是我的源代码:

public class MyDatabaseHelper extends SQLiteOpenHelper {

private Context context;
private static final String DATABASE_NAME = "my_manager.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME =  "my_manager";
private static final String COLUMN_ID = "location_id";
private static final String COLUMN_LOCATION = "location_name";
private static final String COLUMN_COUNTY = "location_county";
private static final String COLUMN_DESCRIPTION = "location_description";

public MyDatabaseHelper(@Nullable Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE " + TABLE_NAME +
" (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_LOCATION + " TEXT, " +
COLUMN_COUNTY + " TEXT, " +
COLUMN_DESCRIPTION + " TEXT );";
db.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);

}
void addLocation(String location, String county, String description){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COLUMN_LOCATION, location);
cv.put(COLUMN_COUNTY, county);
cv.put(COLUMN_DESCRIPTION, description);
long result = db.insert(TABLE_NAME, null, cv);
if (result == -1){
Toast.makeText(context, "Failed!" , Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context, "Added Successfully" , Toast.LENGTH_SHORT).show();
}
}
Cursor readAllData(){
String query = "SELECT * FROM " + TABLE_NAME;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = null;
if(db != null){
cursor = db.rawQuery(query, null);
}
return cursor;
}
}

当您第一次运行应用程序时,会执行onCreate,并设置第一次执行时的架构,并且DATABASE_VERSION与该架构关联。

每次在构造函数(super(context, DATABASE_NAME, null, DATABASE_VERSION);(中调用super时,SQLiteOpenHelper代码都会查看数据库版本号,以及是否调用了比上次定义的onUpgrade更大的版本号。

在最初的开发过程中,在首次发布之前,当您添加到应用程序时,通常会更改模式。在这种模式下,您有两个选择:

  1. 每次架构更改(数据丢失(时卸载并重新安装应用程序。这导致初始onCreate被调用,并再次使用与版本相关联的新模式
  2. 切换版本(只需要高于以前的版本(,然后调用onUpgrade,您可能会在其中使用ALTER TABLE(添加/修改列(或CREATE TABLE来添加新表

第二个选项通常在应用程序已经发布并且需要更改架构(不会丢失数据(时使用。最终用户将收到一个应用程序更新,onUpdate将被调用(因为版本被更改(,任何更改都将应用于他们现有的数据库,而不会丢失数据(假设onUpgrade没有故意销毁数据(。

如果在初始开发过程中数据丢失不是问题,那么卸载/重新安装选项似乎最简单。

如果您只是更改模式而不更改版本,那么基本上什么都不会受到影响——因此,例如,当您对新列执行查询时,它会抱怨它不存在,因为它从未添加过。

相关内容

最新更新