Android - 还原数据库在数据库文件丢失时清除数据库

时间:2012-05-02 18:33:20

标签: android sqlite

我找到了tutorial,它将数据库作为备份复制到文件夹,并将其作为还原复制回应用程序的数据库文件夹。几乎所有东西都工作正常,除了一件事:当我从我的文件夹中删除备份的.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();
                }

修改: 我添加了Jason的答案,它仍然清除了数据库,即使我将 false 发送到directoryB并让恢复失败!文件未找到!目录/文件不存在?消息???!?!

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();
                    }

1 个答案:

答案 0 :(得分:1)

在继续恢复操作之前检查文件是否存在,如下所示:

new File(directory, "/myapp.db").exists()
如果文件不存在,

FileInputStream将自动创建文件。