SQLiteDatabase 库表操作问题个人小结
activity类:
1 protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.activity_main); 4 5 mydata=new mdata(getApplicationContext(),DB_FILE,null,1); 6 7 mydata.sqlt="CREATE TABLE "+DB_TABLE+"(STUDENTSCARD_id TEXT PRIMARY KEY);"; 8 9 sqtt=mydata.getWritableDatabase(); 10 11 }
SQLiteOpenHelper类:
1 public mdata(Context context, String name, CursorFactory factory, 2 int version) { 3 super(context, name, factory, version); 4 // TODO 自动生成的构造函数存根 5 sqlt=""; 6 } 7 @Override 8 public void onCreate(SQLiteDatabase db) { 9 // TODO 自动生成的方法存根l 10 //sqlt=null; 11 if(sqlt.isEmpty()){ 12 13 return; 14 } 15 16 db.execSQL(sqlt); 17 }
问题现象:在执行添加数据操作
ContentValues cv=new ContentValues(); et.setText(cardID[0]); cv.put("STUDENTSCARD_id",“bokeyuan”); sqtt.insert(DB_TABLE, null, cv)
发现程序直接崩溃(------在执行程序之前已经有一次执行操作当时的创表字段STUDENTSCARD_id的类型不为TEXT 而是INTEGER)
问题查找:经过各种排查发现SQLiteOpenHelper中的代码只有在程序第一次创库时才会运行,也就是说当你第一次写好代码运行时才会运行进去 之后不管你怎么更改建表代码(不更改库名) 程序都不会在执行相应的sql语句操作操作
所以才会发生我之前表中字段为integer 在我更改为text后无法插入string类型的值的情况
总结下来就是程序不会因为你每次的程序启动而覆盖你之前创建的库和表
解决方法:1.最简单的方法就是更改库名
2.删除之前创建的库
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步