SQL 数据库文件重写时崩溃 android

SQL crash on database file rewrite android

我正在尝试将我的应用程序中生成的数据库文件备份到 .zip 文件,然后将它们解压缩以恢复到 /data/data/<packagename>/databases/ 文件夹。我只压缩数据库文件而不压缩 -journal files。当我单击恢复选项时,.db 文件被解压缩并移动到 /databases/ 文件夹。这里的问题是我在移动文件时遇到崩溃。以下是错误日志:

E/UncaughtException: android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032)
                                                                          #################################################################
                                                                          Error Code : 1032 (SQLITE_READONLY_DBMOVED)
                                                                          Caused By : Database or Journal file have been removed.
                                                                            (attempt to write a readonly database (code 1032))
                                                                          #################################################################
                                                                              at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)

解压后移动文件的功能:

public void moveContents(){
        File destinationFolder = new File(DATABASE_FOLDER_PATH);
        File sourceFolder = new File(Environment.getExternalStorageDirectory() + "/AppName/Backups/_extracts");
        if (!destinationFolder.exists())
        {
            destinationFolder.mkdirs();
        }
        // Check weather source exists and it is folder.
        if (sourceFolder.exists() && sourceFolder.isDirectory())
        {
            // Get list of the files and iterate over them
            File[] listOfFiles = sourceFolder.listFiles();
            if (listOfFiles != null)
            {
                for (File child : listOfFiles )
                {
                    try {
                        File checkFile=new File(destinationFolder+"/"+child.getName());
                        if(checkFile.exists()){
                            checkFile.delete();
                            FileUtils.moveFileToDirectory(child,destinationFolder,false);
                        }else{
                            FileUtils.moveFileToDirectory(child,destinationFolder,false);
                        }

                    } catch (IOException e) {
                        Log.e("FLERROR","ERROR",e);
                    }
                    // Move files to destination folder
                }

                // Add if you want to delete the source folder
                sourceFolder.delete();
            }
        }

        else
        {
            System.out.println(sourceFolder + "  Folder does not exists");
        }
    }

应用程序崩溃并关闭。

请帮忙。提前致谢。

根据您的错误日志,您似乎正在尝试移动只读的数据库。您将必须获得数据库的可写许可。

所以在移动您的数据库之前。使用它使其可写。

String yourpath = DB_PATH + DATABASE_NAME;
SQLiteDatabase yourdb = SQLiteDatabase.openDatabase(yourpath, null, SQLiteDatabase.OPEN_READWRITE);