下面是 DatabaseHelper 类:
public class DatabaseHelper extends SQLiteOpenHelper {
static final String dbName="demoDB";
public DatabaseHelper(Context context) {
super(context, dbName, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE IF NOT EXISTS players (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"playerName TEXT)";
db.execSQL(sql);
ContentValues values = new ContentValues();
values.put("playerName", "John");
db.insert("players", "playerName", values);
values.put("playerName", "George");
db.insert("players", "playerName", values);
values.put("firstName", "Marie");
db.insert("players", "playerName", values);
System.out.println("Hello");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS players");
onCreate(db);
}
}
在 main activity 中我获取数据的方法:
if (cursor!= null) {
if (cursor.moveToFirst()) {
do {
System.out.println(cursor.getString(cursor.getColumnIndexOrThrow("playerName")));
} while (cursor.moveToNext());
}
}
为什么column没有创建?异常如下:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mkyong.android/com.mkyong.android.Stats}: java.lang.IllegalArgumentException: column 'playerName' does not exist
该回答引用ChatGPT
根据你提供的信息,看起来出现了两个问题:
创建表时,只添加了 id 和 playerName 两个列,但在插入数据时却尝试插入 firstName。这可能会导致异常,因为该列在表中不存在。你需要将插入语句更改为只包含现有列:
values.put("playerName", "John");
db.insert("players", null, values);
values.put("playerName", "George");
db.insert("players", null, values);
在查询时,你尝试访问一个名为 playerName 的列,但表中不存在该列。这可能是由于你已经修改了表结构,但应用程序仍在使用旧的数据库版本。你可以尝试删除应用程序的数据,然后重新运行以重置数据库。或者,你可以更新 onUpgrade() 方法以更新表结构并保存现有数据。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE players ADD COLUMN firstName TEXT");
}
这将向表中添加一个名为 firstName 的新列。注意,这将删除现有的 players 表,因此你需要确保在添加新列之前将数据备份到另一个位置。