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

Posted

技术标签:

【中文标题】如何以编程方式备份​​ SD 卡中的 sqlite 文件?【英文标题】:How can I backup sqlite file in SD Card programmatically? 【发布时间】:2012-09-11 11:12:50 【问题描述】:

当您使用模拟器时,您的 sqlite 文件存储在主应用程序文件夹附近的文件夹中,您可以下载它。但是在没有 root 权限的设备中无法访问此功能。如何以编程方式备份​​ SD 卡中现有的 sqlite 文件

我想在我的应用程序中有一个按钮,用于将此文件存储在我的 SD 卡中的特殊路径中。有可能吗?

谢谢,

【问题讨论】:

类似问题***.com/questions/1995320/… 它没有说明如何将现有数据库复制到sd卡 【参考方案1】:

你可以试试这个,为我工作,记得在你的清单中获得 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) 
                
            
        
    

【讨论】:

【参考方案2】:

你可以试试下面的代码,

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

【讨论】:

这不会复制现有数据库。它在此路径中创建 @breceivemail 根据您之前的问题标题如何以编程方式将 sqlite 文件存储在 SD 卡中?,它完全满足要求。【参考方案3】:

你可以试试这个来复制一个文件:

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) 

        

    

这是获取内部数据库文件名的代码:

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

将 MY_DB_NAME 替换为您的数据库名称

【讨论】:

以上是关于如何以编程方式备份​​ SD 卡中的 sqlite 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中以编程方式将 sqlite 文件保存在本地文件夹或 nsbundle 中?

如何将SQLite数据库备份到SD卡?

如何将数据库文件备份到 Android 上的 SD 卡?

如何在android中获取存储在sd卡中的文件名

重命名 SD 卡中的文件夹

如何从 Android API 24+ 在 SD 卡上写入文件