Android通过FTPClient下载SQLite数据库后文件损坏求助
问题:FTP下载SQLite数据库后文件损坏
我开发的Android应用需要从FTP下载名为bdGeneral的SQLite数据库。手动将该文件上传到平板数据目录可正常使用,但通过FTPClient代码下载后文件直接损坏;操作数据库时Android会生成bdGeneral.corrupt文件。该功能此前正常运行多年,近期突然出现问题。
相关代码
try{ Thread myThread = new Thread(() -> { try { FTPClient ftpClient = new FTPClient(); ftpClient.connect(Constantes.FtpServer, Constantes.FtpPort); ftpClient.login(Constantes.FtpUser, Constantes.FtpPassword); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); try { OutputStream outputStream1 = new BufferedOutputStream( new FileOutputStream(new File(ct.getDatabasePath("bdGeneral").getPath())) ); boolean success = ftpClient.retrieveFile("BaseDatos/bdGeneral", outputStream1); outputStream1.close(); //Elimino registros BbddGeneral bdGeneral = new BbddGeneral(ct, "bdGeneral", null, 1); SQLiteDatabase d = bdGeneral.getWritableDatabase();
控制台报错日志
(11) Invalid page count: nPage: 13477, nPageFile: 13375 ... E/SQLiteDatabase: DB wipe detected: package=par.fg.fg2022 reason=corruption file=/data/user/0/par.fg.fg2022/databases/bdGeneral ctime=2023-07-04T21:59:02Z mtime=2023-07-04T21:59:02Z atime=2023-07-04T21:58:52Z checkfile [unable to obtain timestamp] java.lang.Throwable: STACKTRACE at android.database.sqlite.SQLiteDatabase.wipeDetected(SQLiteDatabase.java:3994) ... at java.lang.Thread.run(Thread.java:1012)
排查方向
- 下载完整性校验缺失:代码未校验
retrieveFile返回的success值,也没对比本地文件与FTP服务器文件的大小/哈希值。报错显示数据库页面数不匹配,说明文件下载不完整,大概率是网络丢包或传输中断导致。 - 流缓冲未完全写入:
BufferedOutputStream的缓冲可能未全部刷新到磁盘就开始操作数据库。建议关闭流前调用outputStream1.flush(),或使用try-with-resources自动管理流,确保数据全部写入磁盘。 - FTP连接配置异常:检查FTP服务器是否近期修改了配置(如被动模式端口、传输模式强制为ASCII)。虽然代码设置了
BINARY_FILE_TYPE,但可通过ftpClient.getFileType()确认实际生效的传输类型,避免二进制文件被ASCII模式转换损坏。 - 目标文件被占用:下载前需确保
bdGeneral未被其他数据库连接占用。若旧连接未关闭,新写入的文件可能被截断。下载前应关闭所有数据库连接,甚至先删除旧文件再重新下载。 - 存储权限问题:近期Android系统更新可能导致存储权限变化,即使能写入文件,也可能因权限不足导致写入不完整。确认目标路径
ct.getDatabasePath("bdGeneral").getPath()正确,应用拥有对应存储权限(旧系统需WRITE_EXTERNAL_STORAGE,新系统需适配Scoped Storage)。
内容的提问来源于stack exchange,提问作者PAR
相关产品推荐
相关产品推荐

