Android中SQLite两次INSERT调用仅一组数据插入成功求助
问题排查与解决方案
作为Android SQLite新手,你遇到的var数组数据无法插入的问题,主要是代码里的两个关键错误导致的,我帮你拆解并给出修复方案:
1. 数组循环边界错误(最直接的触发原因)
你两个for循环都用了<=来判断终止条件,比如:
for(int i=0;i<=namefile.length;i++)
数组的索引是从0开始到length-1结束的,当i等于namefile.length时,namefile[i]会直接触发ArrayIndexOutOfBoundsException(数组越界异常)。一旦第一个循环抛出这个异常,程序就会终止,处理var数组的第二个循环根本没机会执行,自然数据插不进去。
修正方法很简单,把循环条件改成<:
// 处理namefile数组的循环 for(int i=0;i<namefile.length;i++){ // 你的原有代码逻辑... } // 处理var数组的循环 for(int a=0;a<var.length;a++){ db.addData(new Foto(fDate,siteid,"genset_progres","",var[a])); }
2. 数据库连接频繁关闭的隐患
你的addData方法里,每次插入数据后都调用了db.close():
public void addData(Foto foto) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); // ...赋值操作 db.insert(TABLE_SHOPS, null, values); db.close(); // 每次插入都关闭数据库 }
这会导致第一次插入后,SQLite连接就被关闭了,后续调用addData时虽然getWritableDatabase()会重新打开连接,但频繁关闭/打开不仅效率低,还可能引发隐性异常,影响后续插入操作。
建议修改addData方法,移除每次插入后的关闭操作,转而在所有插入完成后统一关闭:
// 修改后的addData方法 public void addData(Foto foto) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_TGL, foto.getDate()); values.put(KEY_SITEID, foto.getSiteid()); values.put(KEY_KATEGORI, foto.getKategori()); values.put(KEY_FILENAME, foto.getFilename()); values.put(KEY_PATH, foto.getPath()); db.insert(TABLE_SHOPS, null, values); // 移除db.close() } // 在Activity中所有插入操作完成后,统一关闭数据库 // 比如两个for循环结束后: db.close(); // 这里的db是你的DBHandler实例
额外排查技巧:添加异常捕获
作为新手,建议给代码加上异常捕获,这样能在Logcat里看到具体的错误信息,快速定位问题:
try{ // 处理namefile数组的循环代码... // 处理var数组的循环代码... db.close(); // 统一关闭数据库 } catch (Exception e){ e.printStackTrace(); // 打印异常日志,方便排查 }
按照上面的步骤修改后,两组数据应该都能成功插入到SQLite表中了。
内容的提问来源于stack exchange,提问作者BrenDonie
相关产品推荐
相关产品推荐

