You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 05:07:32