代码之家  ›  专栏  ›  技术社区  ›  Bob

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

  •  6
  • Bob  · 技术社区  · 12 年前

    当你使用模拟器时,你的sqlite文件存储在主应用程序文件夹附近的文件夹中,你可以下载它。但在非根设备中无法访问此功能。我怎么能 以编程方式备份SD卡中现有的sqlite文件 ?

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

    谢谢

    3 回复  |  直到 12 年前
        1
  •  17
  •   jaredzhang    12 年前

    你可以试试这个,为我工作,记得在你的清单中获得WRITE_EEXTERNAL_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
  •  1
  •   Lucifer phtrivier    12 年前

    您可以尝试以下代码,

    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);
    
        3
  •  1
  •   JackTools.Net    12 年前

    您可以尝试复制文件:

    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替换为数据库的名称