2011-06-30 23 views
41

私はバックアップのために簡単なSQLiteエクスポート/インポートを実装しようとしています。エクスポートは、生のcurrent.dbファイルのコピーを保存するだけです。インポートのためにしたいのは、古いcurrent.dbファイルを削除し、imported.dbファイルの名前をcurrent.dbに変更することです。これは可能ですか?私はこのソリューションをしようとすると、私は次のエラーを取得する:AndroidでSQLiteデータベースを簡単にエクスポートしてインポートする

06-30 13:33:38.831: ERROR/SQLiteOpenHelper(23570): 
    android.database.sqlite.SQLiteDatabaseCorruptException: error code 11: database disk image is malformed 

私はSQLiteブラウザで生のデータベースファイルを見れば、それは正常に見えます。

答えて

101

データベースファイルをインポートする私のアプリケーションの1つでSQLiteOpenHelperでこのコードを使用します。

編集:質問に私のFileUtils.copyFile()メソッドを貼り付けました。

SQLiteOpenHelper

public static String DB_FILEPATH = "/data/data/{package_name}/databases/database.db"; 

/** 
* Copies the database file at the specified location over the current 
* internal application database. 
* */ 
public boolean importDatabase(String dbPath) throws IOException { 

    // Close the SQLiteOpenHelper so it will commit the created empty 
    // database to internal storage. 
    close(); 
    File newDb = new File(dbPath); 
    File oldDb = new File(DB_FILEPATH); 
    if (newDb.exists()) { 
     FileUtils.copyFile(new FileInputStream(newDb), new FileOutputStream(oldDb)); 
     // Access the copied database so SQLiteHelper will cache it and mark 
     // it as created. 
     getWritableDatabase().close(); 
     return true; 
    } 
    return false; 
} 

のfileutils

public class FileUtils { 
    /** 
    * Creates the specified <code>toFile</code> as a byte for byte copy of the 
    * <code>fromFile</code>. If <code>toFile</code> already exists, then it 
    * will be replaced with a copy of <code>fromFile</code>. The name and path 
    * of <code>toFile</code> will be that of <code>toFile</code>.<br/> 
    * <br/> 
    * <i> Note: <code>fromFile</code> and <code>toFile</code> will be closed by 
    * this function.</i> 
    * 
    * @param fromFile 
    *   - FileInputStream for the file to copy from. 
    * @param toFile 
    *   - FileInputStream for the file to copy to. 
    */ 
    public static void copyFile(FileInputStream fromFile, FileOutputStream toFile) throws IOException { 
     FileChannel fromChannel = null; 
     FileChannel toChannel = null; 
     try { 
      fromChannel = fromFile.getChannel(); 
      toChannel = toFile.getChannel(); 
      fromChannel.transferTo(0, fromChannel.size(), toChannel); 
     } finally { 
      try { 
       if (fromChannel != null) { 
        fromChannel.close(); 
       } 
      } finally { 
       if (toChannel != null) { 
        toChannel.close(); 
       } 
      } 
     } 
    } 
} 

は、必要に応じて、古いデータベースファイルを削除することを忘れないでください。

+0

をお楽しみ進み、これは完全に働いたので、ありがとうございました! –

+0

これはとても良い解決策です。乾杯。 –

+4

あなたが好きな答えを投票し、コミュニティがどれが良いか、そして何が迷惑かを知るのを助けます。 –

29

これは、あなたが好きなあなたはそれに名前を付けることができ、バックアップフォルダという名前のフォルダにデータベースをエクスポートするための簡単な方法と同じフォルダいけない追加することを忘れ

public class ExportImportDB extends Activity { 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      // TODO Auto-generated method stub 
      super.onCreate(savedInstanceState); 
//creating a new folder for the database to be backuped to 
      File direct = new File(Environment.getExternalStorageDirectory() + "/Exam Creator"); 

       if(!direct.exists()) 
       { 
        if(direct.mkdir()) 
         { 
         //directory is created; 
         } 

       } 
      exportDB(); 
      importDB(); 

     } 
    //importing database 
     private void importDB() { 
      // TODO Auto-generated method stub 

      try { 
       File sd = Environment.getExternalStorageDirectory(); 
       File data = Environment.getDataDirectory(); 

       if (sd.canWrite()) { 
        String currentDBPath= "//data//" + "PackageName" 
          + "//databases//" + "DatabaseName"; 
        String backupDBPath = "/BackupFolder/DatabaseName"; 
        File backupDB= new File(data, currentDBPath); 
        File currentDB = new File(sd, backupDBPath); 

        FileChannel src = new FileInputStream(currentDB).getChannel(); 
        FileChannel dst = new FileOutputStream(backupDB).getChannel(); 
        dst.transferFrom(src, 0, src.size()); 
        src.close(); 
        dst.close(); 
        Toast.makeText(getBaseContext(), backupDB.toString(), 
          Toast.LENGTH_LONG).show(); 

       } 
      } catch (Exception e) { 

       Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG) 
         .show(); 

      } 
     } 
    //exporting database 
     private void exportDB() { 
      // TODO Auto-generated method stub 

      try { 
       File sd = Environment.getExternalStorageDirectory(); 
       File data = Environment.getDataDirectory(); 

       if (sd.canWrite()) { 
        String currentDBPath= "//data//" + "PackageName" 
          + "//databases//" + "DatabaseName"; 
        String backupDBPath = "/BackupFolder/DatabaseName"; 
        File currentDB = new File(data, currentDBPath); 
        File backupDB = new File(sd, backupDBPath); 

        FileChannel src = new FileInputStream(currentDB).getChannel(); 
        FileChannel dst = new FileOutputStream(backupDB).getChannel(); 
        dst.transferFrom(src, 0, src.size()); 
        src.close(); 
        dst.close(); 
        Toast.makeText(getBaseContext(), backupDB.toString(), 
          Toast.LENGTH_LONG).show(); 

       } 
      } catch (Exception e) { 

       Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG) 
         .show(); 

      } 
     } 

    } 

からデータベースをインポートするための簡単な方法であり、この権限は、それが

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > 
    </uses-permission> 

+1

何とかimportDBとexportDBの手順はまったく同じですか? – Taifun

+1

間違っています:あなたがよく見れば、 'currentDB'変数はimportDBのデータフォルダファイルとexportDBのsdフォルダを参照します。 – ravemir

+2

root以外の端末でも動作しますか? – Sarfraz

関連する問題