我已经在我的SQLiteOpenHelper onCreate()中创建了我的表
SQLiteException: no such table
or
SQLiteException: no such column
错误。为什么?
注意: (这是每周数十个类似问题的汇总。试图在这里提供一个“规范的”社区wiki问题/答案,以便所有这些问题都可以指向一个很好的参考。)
我已经在我的SQLiteOpenHelper onCreate()中创建了我的表
SQLiteException: no such table
or
SQLiteException: no such column
错误。为什么?
注意: (这是每周数十个类似问题的汇总。试图在这里提供一个“规范的”社区wiki问题/答案,以便所有这些问题都可以指向一个很好的参考。)
当前回答
也许我太晚了,但我想分享我简短而甜蜜的答案。 请检查答案相同的问题。它肯定会对你有帮助。没有更深层次的规范。
如果你对创建表的语法有信心,那么当你在同一个表中添加新列时,可能会发生这种情况,因为…
1)从设备上卸载并重新运行。
OR
2)设置—> app—> ClearData
OR
3)在DatabaseHandler类中修改DATABASE_VERSION(如果你添加了新列,它会自动升级)
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
OR
4)在“DatabaseHandler”类中更改DATABASE_NAME(我也面临同样的问题。但是我通过改变DATABASE_NAME成功了。)
其他回答
也许我太晚了,但我想分享我简短而甜蜜的答案。 请检查答案相同的问题。它肯定会对你有帮助。没有更深层次的规范。
如果你对创建表的语法有信心,那么当你在同一个表中添加新列时,可能会发生这种情况,因为…
1)从设备上卸载并重新运行。
OR
2)设置—> app—> ClearData
OR
3)在DatabaseHandler类中修改DATABASE_VERSION(如果你添加了新列,它会自动升级)
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
OR
4)在“DatabaseHandler”类中更改DATABASE_NAME(我也面临同样的问题。但是我通过改变DATABASE_NAME成功了。)
扩展SQLiteOpenHelper时要记住的要点
super(context, DBName, null, DBversion); - This should be invoked first line of constructor override onCreate and onUpgrade (if needed) onCreate will be invoked only when getWritableDatabase() or getReadableDatabase() is executed. And this will only invoked once when a DBName specified in the first step is not available. You can add create table query on onCreate method Whenever you want to add new table just change DBversion and do the queries in onUpgrade table or simply uninstall then install the app.
您可以创建数据库和表
public class DbHelper extends SQLiteOpenHelper {
private static final String DBNAME = "testdatbase.db";
private static final int VERSION = 1;
public DbHelper(Context context) {
super(context, DBNAME, null, VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table BookDb(id integer primary key autoincrement,BookName text,Author text,IssuedOn text,DueDate text,Fine text,Totalfine text");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS BookDb");
onCreate(db);
}
}
注意:如果您想创建另一个表或添加列或没有这样的表,只需增加VERSION
根据Jaskey的要求,进一步补充这里的缺失点
数据库版本存储在SQLite数据库文件中。
Catch是构造函数
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
因此,当使用名称(第2个参数)调用数据库helper构造函数时,平台检查数据库是否存在,如果数据库存在,它从数据库文件头中获取版本信息并触发正确的回调
正如在旧的回答中已经解释的那样,如果具有该名称的数据库不存在,则会触发onCreate。
下面用一个例子解释onUpgrade的情况。
比方说,你的第一个版本的应用程序有DatabaseHelper(扩展SQLiteOpenHelper),构造函数将version传递为1,然后你提供了一个升级的应用程序,新的源代码将version传递为2,然后当DatabaseHelper被构造时,平台会自动看到文件已经存在,但版本低于你传递的当前版本,从而触发onUpgrade。
现在,假设您计划提供一个db version为3的应用程序的第三个版本(只有当数据库模式要修改时,db version才会增加)。在这种增量升级中,您必须从每个版本增量地编写升级逻辑,以获得更好的可维护代码
下面是伪代码示例:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion) {
case 1:
//upgrade logic from version 1 to 2
case 2:
//upgrade logic from version 2 to 3
case 3:
//upgrade logic from version 3 to 4
break;
default:
throw new IllegalStateException(
"onUpgrade() with unknown oldVersion " + oldVersion);
}
}
注意情况1和2中缺少break语句。这就是我所说的增量升级。
假设旧版本是2,新版本是4,那么逻辑将把数据库从2升级到3,然后再升级到4
如果旧版本是3,新版本是4,它将只运行3到4的升级逻辑
Sqliteopenhelper的方法有create方法和upgrade方法,create方法在任何表第一次创建时使用,而upgrade方法将在每次表的列数发生变化时调用。