android开发分享什么时候SQLiteOpenHelper的onCreate()/ onUpgrade()运行?

我在我的SQLiteOpenHelper onCreate()创build我的表,但收到

 SQLiteException: no such table 

要么

 SQLiteException: no such column 

错误。 为什么?

注意:

(这是每周几十个类似问题的汇总总结,试图在这里提供一个“规范的”社区wiki问题/答案,以便所有这些问题都可以被引导到一个很好的参考)。

    实际打开数据库时调用SQLiteOpenHelper onCreate()onUpgrade()callback,例如调用getWritableDatabase() 。 创build数据库帮助程序对象时,数据库不会打开。

    SQLiteOpenHelper版本的数据库文件。 版本号是传递给构造函数的int参数。 在数据库文件中,版本号存储在PRAGMA user_version

    onCreate()只在数据库文件不存在并刚刚创build时才运行。 如果onCreate()成功返回(不抛出exception),则假定数据库使用所请求的版本号创build。 作为暗示,您不应该在onCreate()捕获SQLException

    onUpgrade()只在数据库文件存在时才被调用,但存储的版本号低于构造函数中的要求。 onUpgrade()应该将表模式更新为所请求的版本。

    在代码( onCreate() )中更改表架构时,应确保数据库已更新。 两个主要方法:

    根据Jaskey的要求,在这里进一步增加缺失点

    数据库版本存储在SQLite数据库文件中。

    catch是构造函数

     SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 

    因此,当数据库帮助器构造函数被调用name (第二参数)时,平台会检查数据库是否存在,如果数据库存在,它将从数据库文件头获取版本信息并触发正确的callback

    正如前面已经解释过的,如果名称不存在的数据库,它会触发onCreate

    下面以一个例子来说明onUpgrade情况。

    假设你的第一个版本的应用程序有DatabaseHelper (扩展SQLiteOpenHelper ),其构造函数传递版本为1 ,然后你提供了一个升级的应用程序,新的源代码的版本传递为2 ,然后当DatabaseHelper被构造时,平台自动触发onUpgrade看到文件已经存在,但版本低于您已经传递的当前版本。

    现在说你打算给数据库版本为3的应用程序的第三个版本(db版本是只有当数据库架构将被修改)。 在这种增量升级中,您必须逐渐从每个版本编写升级逻辑,以获得更好的可维护代码

    下面的例子伪代码:

     @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); } } 

    注意情况12的缺失break声明。 这就是我所说的增量升级。

    说如果旧版本是2 ,新版本是4 ,那么逻辑将数据库从2升级到3 ,然后升级到4

    如果旧版本为3 ,新版本为4 ,则只运行升级逻辑34

    onCreate()

    onUpgrade()

    可能是我太晚了,但我想分享我简短而甜蜜的回答。 请检查答案是否有同样的问题。 这一定会帮助你。 没有更深的规格。

    如果您对创build表的语法有信心,那么当您在同一个表中添加新列时,可能会发生这种情况。

    1)从您的设备卸载并再次运行。

    要么

    2)设置 – >应用程序 – > ClearData

    要么

    3)在你的“DatabaseHandler”类中更改DATABASE_VERSION (如果你添加了新的列而不是自动升级)

     public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } 

    要么

    4)改变你的“DatabaseHandler”类中的DATABASE_NAME (我面临同样的问题,但是我通过改变DATABASE_NAME成功)。

    在扩展SQLiteOpenHelper时要记住的SQLiteOpenHelper

    你可以像创build数据库和表

     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); } } 

    注意:如果你想创build另一个表或添加列或没有这样的表,只需增加VERSION

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

    没有find这样的表主要是当你没有打开与getwritabledata()SQLiteOpenHelper类之前,你还必须调用与数据库名称和版本的构造函数。 并且在SQLiteOpenHelper类中给定的版本号中有升级值时调用SQLiteOpenHelper

    下面是代码片段(找不到这样的列可能是因为列名中的拼写):

     public class database_db { entry_data endb; String file_name="Record.db"; SQLiteDatabase sq; public database_db(Context c) { endb=new entry_data(c, file_name, null, 8); } public database_db open() { sq=endb.getWritableDatabase(); return this; } public Cursor getdata(String table) { return sq.query(table, null, null, null, null, null, null); } public long insert_data(String table,ContentValues value) { return sq.insert(table, null, value); } public void close() { sq.close(); } public void delete(String table) { sq.delete(table,null,null); } } class entry_data extends SQLiteOpenHelper { public entry_data(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase sqdb) { // TODO Auto-generated method stub sqdb.execSQL("CREATE TABLE IF NOT EXISTS 'YOUR_TABLE_NAME'(Column_1 text not null,Column_2 text not null);"); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { onCreate(db); } } 

    如果您忘记提供一个“名称”string作为构造函数的第二个参数,它会创build一个“内存”数据库,当您closures该应用程序时将被删除。

    您的数据库名称必须以.db结尾,您的查询string也必须有一个终止符(;)

    Sqliteopenhelper的方法有方法创build和升级,创build时使用,当任何表第一次创build和升级方法将调用每当表的列号改变。

      以上就是android开发分享什么时候SQLiteOpenHelper的onCreate()/ onUpgrade()运行?相关内容,想了解更多android开发(异常处理)及android游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/addevelopment/524034.html

      (0)
      上一篇 2020年12月13日
      下一篇 2020年12月13日

      精彩推荐