我已经在我的SQLiteOpenHelper onCreate()中创建了我的表

SQLiteException: no such table

or

SQLiteException: no such column

错误。为什么?

注意: (这是每周数十个类似问题的汇总。试图在这里提供一个“规范的”社区wiki问题/答案,以便所有这些问题都可以指向一个很好的参考。)


当前回答

数据库名必须以.db结尾,查询字符串必须有结束符(;)

其他回答

根据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的升级逻辑

当需要创建表时,第一次调用onCreate。我们需要重写这个方法,在这里我们编写了由SQLiteDatabase执行的表创建脚本。execSQL方法。在第一次部署中执行后,此方法将不再被调用。

onUpgrade 当数据库版本升级时调用此方法。假设第一次部署时,数据库版本为1,在第二次部署时,数据库结构发生了变化,例如在表中增加了额外的列。假设数据库版本现在是2。

Sqliteopenhelper的方法有create方法和upgrade方法,create方法在任何表第一次创建时使用,而upgrade方法将在每次表的列数发生变化时调用。

从模拟器或设备卸载应用程序。再次运行应用程序。(OnCreate()不执行时,数据库已经存在)

在DatabaseHandler/DatabaseManager类中重新检查您的查询(您曾经使用过的类)