简体   繁体   English

如何以编程方式备份​​SD卡中的sqlite文件?

[英]How can I backup sqlite file in SD Card programmatically?

When you use emulator your sqlite file is stored in a folder near your main application folder and you can download it. 当您使用模拟器时,您的sqlite文件存储在主应用程序文件夹附近的文件夹中,您可以下载它。 But this feature is not accessible in not rooted devices. 但是,在没有root设备的情况下无法访问此功能。 How can I backup this existing sqlite file in SD Card programmatically ? 如何以编程方式备份​​SD卡中现有的sqlite文件

I want to have a button in my application that stores this file in a special path in my SD Card. 我希望在我的应用程序中有一个按钮,将该文件存储在SD卡的特殊路径中。 Is it possible? 可能吗?

Thanks, 谢谢,

You can try this, work for me, remember to get the WRITE_EXTERNAL_STORAGE permission in your manifest: 你可以尝试这个,为我工作,记得在你的清单中获得WRITE_EXTERNAL_STORAGE权限:

// Copy to sdcard for debug use
    public static void copyDatabase(Context c, String DATABASE_NAME) {
        String databasePath = c.getDatabasePath(DATABASE_NAME).getPath();
        File f = new File(databasePath);
        OutputStream myOutput = null;
        InputStream myInput = null;
        Log.d("testing", " testing db path " + databasePath);
        Log.d("testing", " testing db exist " + f.exists());

        if (f.exists()) {
            try {

                File directory = new File("/mnt/sdcard/DB_DEBUG");
                if (!directory.exists())
                    directory.mkdir();

                myOutput = new FileOutputStream(directory.getAbsolutePath()
                        + "/" + DATABASE_NAME);
                myInput = new FileInputStream(databasePath);

                byte[] buffer = new byte[1024];
                int length;
                while ((length = myInput.read(buffer)) > 0) {
                    myOutput.write(buffer, 0, length);
                }

                myOutput.flush();
            } catch (Exception e) {
            } finally {
                try {
                    if (myOutput != null) {
                        myOutput.close();
                        myOutput = null;
                    }
                    if (myInput != null) {
                        myInput.close();
                        myInput = null;
                    }
                } catch (Exception e) {
                }
            }
        }
    }

You can try following code, 您可以尝试以下代码,

String path = Environment.getExternalStorageDirectory().toString() + "/path";
File folder = new File( path );
if (!folder.exists()) 
{
     folder.mkdirs();
}

File dbfile = new File( path + "/database.db" ); 
if ( !dbfile.exists() )
{
    dbFile.createFile();
}
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);

You can try this to copy a file: 您可以尝试此操作来复制文件:

public void copyFile(File in, File out) {
        String DialogTitel = getString(R.string.daten_wait_titel);
        String DialogText = getString(R.string.kopiervorgang_laeuft);
        try {
            // Dialogdefinition Prograssbar
            final ProgressDialog dialog = new ProgressDialog(this) {
                @Override
                public boolean onSearchRequested() {
                    return false;
                }
            };
            dialog.setCancelable(false);
            dialog.setTitle(DialogTitel);
            dialog.setIcon(R.drawable.icon);
            dialog.setMessage(DialogText);
            dialog.show();
            new Thread(new MyCopyThread(in, out)) {
                @Override
                public void run() {
                    try {
                        FileChannel inChannel = new FileInputStream(
                                MyCopyThread.in).getChannel();
                        FileChannel outChannel = new FileOutputStream(
                                MyCopyThread.out).getChannel();
                        try {
                            System.out.println("KOPIEREN");
                            inChannel.transferTo(0, inChannel.size(),
                                    outChannel);
                            if (inChannel != null)
                                inChannel.close();
                            if (outChannel != null)
                                outChannel.close();
                            setCopyError(false);
                        } catch (IOException e) {
                            setCopyError(true);
                            // throw e;
                        } finally {
                            if (inChannel != null)
                                inChannel.close();
                            if (outChannel != null)
                                outChannel.close();
                        }
                        dialog.dismiss();
                        // Abschlussarbeiten
                        if (useExternalSD == true) {
                            // Externe DB
                            moveDBtoExternFinish();
                        } else {
                            // Interne DB
                            moveDBtoInternFinish();
                        }
                        moveDBFinishHandler.sendMessage(moveDBFinishHandler
                                .obtainMessage());
                    } catch (Exception ex) {

                    }
                }
            }.start();
        } catch (Exception exx) {

        }

    }

This is the code to get the filname of your internal db: 这是获取内部数据库的filname的代码:

File interneDB = getApplicationContext().getDatabasePath(MY_DB_NAME);

Replace MY_DB_NAME with the name of your DB 将MY_DB_NAME替换为您的数据库名称

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM