Android SQLiteOpenHelper(二)
上一篇我们已经了解了SQLiteOpenHelper 和 构造函数。
现在我们就来掌握一下:onCreate( ) onUpgrade( ) onDowngrade( )
public void onCreate( SQLiteDatabase db)
api:Called when the database is created for the first time. 首次创建数据库时调用,即没有数据库前身,可用于数据初始化。
参数 db --->指这个数据库
public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub // 编写【从0开始到最新状态】建表语句 Log.i("hi", "没有数据库,创建数据库,创建v3.0成功"); String sql_message = "create table t_message (id int primary key,tou1 varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50),isdel bit default 0)"; String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1',0)"; String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1',0)"; String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1',0)"; db.execSQL(sql_message); db.execSQL(sql_init_1); db.execSQL(sql_init_2); db.execSQL(sql_init_3); }
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
api:
Called when the database needs to be upgraded. The implementation should use this method to drop tables, add tables, or do anything else it needs to upgrade to the new schema version.
The SQLite ALTER TABLE documentation can be found here. If you add new columns you can use ALTER TABLE to insert them into a live table. If you rename or remove columns you can use ALTER TABLE to rename the old table, then create the new table and then populate the new table with the contents of the old table.
意思是:
数据库需要升级时自动回调。实现应该使用这种方法删除表,添加表或做其他事情需要升级到新模式版本。
SQLite ALTER TABLE文档可以在这里找到。如果您添加新列可以使用ALTER TABLE将它们插入到一个生活表。如果您重命名或删除列可以使用ALTER TABLE重命名旧表,然后创建新表和填充旧表的内容。
public void onCreate(SQLiteDatabase db) { Log.i("version", "开始版本2"); db.execSQL("create table info(_id integer primary key,name varchar(20),age integer)"); String sql1="insert into info values(1,'张三','18')"; String sql2="insert into info values(2,'李四','19')"; String sql3="insert into info values(3,'王五','21')"; db.execSQL(sql1); db.execSQL(sql2); db.execSQL(sql3); }
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //升级增加一个列 if (oldVersion == 2){ String sql_upgrade_1 = "alter table t_message add column isdel bit default 0"; db.execSQL(sql_upgrade_1); Log.i("db", "从2到3,升级成功!"); }
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
和onUpgrade一样,一个负责升级,一个负责降级。
/* 模拟从3.0 降低会2.0 */ @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { //正常来讲大于2.0的,应该有t_message 这张表,且2.0有的字段,3.0都有 try { //第一、先把t_message 未来的表,改名 String rename_sql = "alter table t_message rename to t_message_bak"; db.execSQL(rename_sql); Log.i("down", "1.改名成功"); //第二、建立2.0的表结构 String sql_message = "create table t_message (id int primary key,tou1 varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50))"; db.execSQL(sql_message); Log.i("down", "2.建立2.0表结构成功"); //第三、把备份的数据,copy到 新建的2.0的表 String sql_copy = "insert into t_message select id,tou1,userName,lastMessage,datetime from t_message_bak"; db.execSQL(sql_copy); Log.i("down", "3.copy到用户数据到 2.0的表"); //第四、把备份表drop掉 String drop_sql = "drop table if exists t_message_bak"; db.execSQL(drop_sql); Log.i("down", "4.把备份表drop掉"); } catch (Exception e) { //失败 Log.i("hi", "降级失败,重新建立"); String sql_drop_old_table = "drop table if exists t_message"; String sql_message = "create table t_message (id int primary key,tou1 varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50))"; String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')"; String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')"; String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')"; db.execSQL(sql_drop_old_table); db.execSQL(sql_message); db.execSQL(sql_init_1); db.execSQL(sql_init_2); db.execSQL(sql_init_3); } }
上一篇:Android SQLiteOpenHelper(一) http://www.cnblogs.com/hxb2016/p/6118275.html
谢谢大家的关注。怀才就象怀孕,时间久了会让人看出来。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了