1

データベースをバックアップとしてフォルダにコピーし、復元としてアプリのデータベース フォルダにコピーするチュートリアルを見つけました。バックアップした .db ファイルをフォルダーから削除し、アプリで [復元] をクリックすると、ファイルが検索され、見つからず、データベース全体が何も上書きされません。データベース全体を空にしたようなものです。

バックアップ:

try {

                    InputStream myInput;
                    OutputStream myOutput;

                    myInput = new FileInputStream("/data/data/com.me.myapp/databases/HotOrNotdbLists2");//this is
        // the path for all apps
        //insert your package instead packagename,ex:com.mybusiness.myapp


                    // Set the output folder on the SDcard
                     File directory = new File("/sdcard/MyApp/");
                    // Create the folder if it doesn't exist:
                    if (!directory.exists()) 
                    {
                        directory.mkdirs();
                    } 
                    // Set the output file stream up:

                    myOutput = new FileOutputStream(directory.getPath()+
         "/myapp.db");

                    // Transfer bytes from the input file to the output file
                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = myInput.read(buffer))>0)
                    {
                        myOutput.write(buffer, 0, length);
                    }
                    // Close and clear the streams

                    myOutput.flush();

                    myOutput.close();

                    myInput.close();
                    Toast.makeText(Settings.this, "Backup done successfully!", Toast.LENGTH_LONG).show();

                } catch (FileNotFoundException e) {
            Toast.makeText(Settings.this, "Backup unsuccessful! File cannot be created! Directory does not exist?", Toast.LENGTH_LONG).show();


                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
            Toast.makeText(Settings.this, "Backup unsuccessful!", Toast.LENGTH_LONG).show();


                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

戻す:

OutputStream myOutput;

                try {

                    myOutput = new FileOutputStream("/data/data/com.me.myapp/databases/HotOrNotdbLists2");


                    // Set the folder on the SDcard
                     File directory = new File("/sdcard/MyApp/");
                    // Set the input file stream up:

                    InputStream myInputs = new FileInputStream(directory.getPath()+ "/myapp.db");


                    // Transfer bytes from the input file to the output file
                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = myInputs.read(buffer))>0)
                    {
                        myOutput.write(buffer, 0, length);
                    }


                    // Close and clear the streams
                    myOutput.flush();

                    myOutput.close();

                    myInputs.close();   
                  Toast.makeText(Settings.this, "Restore done successfully!", Toast.LENGTH_SHORT).show();

                } catch (FileNotFoundException e) {
        Toast.makeText(Settings.this, "Restore unsuccessful! File not found! Directory does not exist?", Toast.LENGTH_LONG).show();


                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {   Toast.makeText(Settings.this, "Restore unsuccessful!", 
        Toast.LENGTH_SHORT).show();


                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

編集:ジェイソンの回答を追加しましたが、ディレクトリBにfalseを取得して復元に失敗した場合でも、データベースはクリアされます! ファイルが見つかりません!ディレクトリ/ファイルが存在しませんか? メッセージ ???!?!

try {
                        OutputStream myOutput;   
                        myOutput = new FileOutputStream("/data/data/com.me.myapp/databases/HotOrNotdbLists2");

                        // Set the folder on the SDcard
                        File directory = new File("/sdcard/MyApp/");
                        boolean directoryB = new File("/sdcard/MyApp/", "/myapp.db").exists();
   Toast.makeText(Settings.this, "directoryB: " + directoryB, Toast.LENGTH_SHORT).show();

                        if (directoryB == true)
                        {
                           Toast.makeText(Settings.this, "File exists!", Toast.LENGTH_SHORT).show();

                        // Set the input file stream up:

                        InputStream myInputs = new FileInputStream(directory.getPath()+ "/myapp.db");


                        // Transfer bytes from the input file to the output file
                        byte[] buffer = new byte[1024];
                        int length;
                        while ((length = myInputs.read(buffer))>0)
                        {
                            myOutput.write(buffer, 0, length);
                        }


                        // Close and clear the streams
                        myOutput.flush();

                        myOutput.close();

                        myInputs.close();   
                        Toast.makeText(Settings.this, "Restore done successfully!", Toast.LENGTH_SHORT).show();
                        }
                        else
                        {
                            Toast.makeText(Settings.this, "Restore unsuccessful! File not found! Directory/file does not exist?", Toast.LENGTH_SHORT).show();
                        }

                    } catch (FileNotFoundException e) {
            //Toast.makeText(Settings.this, "Restore unsuccessful! File not found! Directory does not exist?", Toast.LENGTH_LONG).show();


                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {   Toast.makeText(Settings.this, "Restore unsuccessful!", 
            Toast.LENGTH_SHORT).show();


                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
4

1 に答える 1

1

次のように、復元操作を続行する前に、まずファイルが存在するかどうかを確認します。

new File(directory, "/myapp.db").exists()

FileInputStreamファイルが存在しない場合は、自動的に作成されます。

于 2012-05-02T18:47:49.153 に答える