2011-11-15 15 views
0

緑色の質問は申し訳ありませんが、解決策はまだ見つかりませんでした。SDカードからデータベースにデータベースをコピーする方法

SDカードのバックアップからデータベースを復元しようとしています。以下のコード(SOここに提供される一つのわずかな修正版)

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

    if (sd.canWrite()) { 
     String currentDBPath = 
      "\\data\\com.dg\\databases\\" + com.dg.Constants.db_Table; 
     String backupDBPath = "com.dg"; 
     File currentDB = new File(data, currentDBPath); 
     File backupDB = new File(sd, backupDBPath); 

     if (currentDB.exists()) { 
      FileChannel dst = new FileInputStream(currentDB).getChannel(); 
      FileChannel src = new FileOutputStream(backupDB).getChannel(); 
      dst.transferFrom(src, 0, src.size()); 
      src.close(); 
      dst.close(); 
     } 
     line4.setText("Successful Import"); 
    } 
} catch (Exception e) { 
    line4.setText(e.toString()); 
} 

データベースファイルが開いていない場合であってもNonWriteableChannelExceptionをスロー。

答えて

0

あなたのデータはあなたがパスにダブル\を取り除くために必要

/data/data/com.dg/databases

で一般的です。

また、Environment.getDataDirectory()を親ディレクトリとして使用し、ファイル名として "\ data \ com.dg \ databases \"(etc)を使用しています。それは全く間違っています。

簡単な方法は、コンテキスト(またはアクティビティ)で 'getDatabasePath'を使用することです。あなたのDBの名前を与えると、あなたにそれへのFile参照を与える必要があります。しかし、もしFileがまだ存在していなければ、それがどうなるか分からない。

http://developer.android.com/reference/android/content/Context.html#getDatabasePath(java.lang.String

また、単純な 'GETDIR( "データベース"、MODE_PRIVATE)' をしようとします。うまくいけば、データベースディレクトリを返すでしょう。本当に汚い

データベースディレクトリのための最終的な試みに、:

File dbDir = new File(getFilesDir().getParentFile(), "databases"); 
+0

お返事ありがとうございます。ディレクトリは間違いなくOKです。最初はほとんど同じコードでバックアップを取ることができました。 (文字列 "\\"は最終出力に\として表示されます) – user1008771

+0

ファイルを読み書きできない場合は、正常ではありません。あなたはUNIXシステム上にいるので、バックスラッシュは間違っています。いくつかのケースではうまくいくかもしれませんが、それはJavaがあなたの間違いを補償しているからです。真剣に。 Linuxでは、スラッシュをスラッシュします。現在、使用しているフォームであるjavaのFileオブジェクトには2つのパラメータがあります。あなたの親ディレクトリであるディレクトリとファイル名。ディレクトリ(間違ったもの)とフォーマットの悪いディレクトリをファイル名として渡しています。新しいファイル( "/ data/data/[あなたのパッケージ] /データベース/ [あなたのdbファイル]")を試してください。そのフォームはフルパスを文字列として取ります。 –

+0

ありがとう、それは多くの意味があります。しかし、問題は解決しません。そのディレクトリの他の場所(つまり/data/data/com.dg/databases/fakeDB)へ​​のコピーは成功しますが、DBファイル自体は成功しません。これは初めてDBを開く前に行われます(スプラッシュアクティビティ) – user1008771

0

は、ユーザー/アプリケーションがデータベースに//する権限を持っていますか? (そうでない場合は、これはANSWER IS)

は、おそらく許可が拒否された理由は、これはあなたを伝えることがあります(上記のリンクから)

IOException: Permission Denied

Bill Moteを、以下の許可設定を指摘しました:

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

私のユーザはrootではなく、特別な "データベースアクセス"パーミッションを見つけることができませんでしたが、私は外部ストレージの書き込みを除いてパーミッションを宣言していません。どの許可を私が宣言すべきか知っていますか? DBは正常に動作しますが、コピーの部分を除いて – user1008771

+0

上記の答えを参照してください。 SDがすでにマウントされていれば、それはAndroidに「読み取り専用」になります。 – Joshua

+0

コード化された提供は、バックアップを作成するためには必須ですが、バックアップからDBを回復することはありません。内部メモリのファイルをSDカードのバージョンに置き換える際に問題が発生しています – user1008771

関連する問題