Android真机SQLite数据库表找不到求助(模拟器运行正常)
我开发的一款使用SQLite存储数据的Android应用,在模拟器上运行完全正常,但在小米NOTE 8真机测试时,运行时提示读取的第一张表找不到。
已完成的排查:
- 已授予应用所有相关权限
- 数据库文件已保存至设备的应用目录(复制代码如下)
- 确认数据库文件名和表名均无错误
从assets复制数据库到应用目录的代码
try { InputStream inputStream = context.getAssets().open(AppDataBase.db_NAME); String outfile = context.getDatabasePath(AppDataBase.db_NAME).getPath(); OutputStream outputStream = new FileOutputStream(outfile); byte[] buft = new byte[1024]; int length = 0; while ((length = inputStream.read(buft)) > 0) { outputStream.write(buft, 0, length); } outputStream.flush(); outputStream.close(); return true; } catch (Exception e) { return false; }
查询表的报错代码
@SuppressLint("Range") public List<Articles_of_Article_Screen> getAllArtigos(){ openDataBase(); String SQL = "SELECT * FROM artigos ORDER by id"; List<Articles_of_Article_Screen> list = new ArrayList<>(); cursor = db.rawQuery(SQL,null); Articles_of_Article_Screen obj; if(cursor.moveToFirst()){ do{ obj = new Articles_of_Article_Screen( cursor.getString(cursor.getColumnIndex("titulo")), cursor.getString(cursor.getColumnIndex("previa"))); list.add(obj); }while (cursor.moveToNext()); } closeDataBase(); return list; }
修复建议
排查数据库复制完整性
复制代码的catch块仅返回false,未输出异常信息,建议添加e.printStackTrace(),查看复制过程中是否有隐藏错误;同时可通过new File(outfile).length()对比assets中数据库的大小,确认文件是否复制完整。校验SQLite版本兼容性
确保assets中的数据库是用与小米NOTE 8系统兼容的SQLite版本创建的,部分高版本SQLite生成的数据库可能在低版本Android设备上无法识别表结构。可用SQLiteStudio等工具打开数据库,确认artigos表确实存在且结构正确。调整数据库路径与打开逻辑
小米设备可能存在特殊的文件路径处理,尝试手动拼接数据库路径:context.getFilesDir().getParent() + "/databases/" + AppDataBase.db_NAME,替代getDatabasePath的返回值;同时建议通过SQLiteOpenHelper管理数据库,在onCreate中完成复制,避免重复复制导致文件损坏。检查表名大小写一致性
部分设备的SQLite对表名大小写敏感,确保SQL语句中的artigos与数据库中的表名大小写完全一致。添加异常捕获与日志
在查询代码中捕获SQLiteException并打印详细错误信息,比如:try { cursor = db.rawQuery(SQL,null); // 后续逻辑 } catch (SQLiteException e) { e.printStackTrace(); Log.e("DB_ERROR", "查询失败: " + e.getMessage()); }通过日志明确错误根源,确认是表不存在、数据库未正确打开还是其他权限问题。
内容的提问来源于stack exchange,提问作者Cristian Nascimento Maurício

