3

次のを使用して、データベースをSDカードにエクスポートしました。SDカードにファイルを作成できましたが、中身が空です。データベースファイルから読み取り、SDソースに書き込めることを確認しました。

転送メソッドで例外がキャッチされましたが、メッセージはnull

log catは、例外に関するそれ以上の情報を表示しません。

データが宛先ファイルに転送されない理由はありますか?

public boolean transferFile(File src, File dest){
        boolean flag = false;
        FileChannel inChannel=null;;
        FileChannel outChannel=null;
        if(!dest.canWrite()){
            Log.d(TAG, "unable to write to: " + dest.getPath());
                return false;
        }

        try{
            inChannel = new FileInputStream(src).getChannel();
            outChannel = new FileInputStream(dest).getChannel();
            inChannel.transferTo(0, inChannel.size(), outChannel);
            //outChannel.transferFrom(inChannel, 0, inChannel.size());
            flag = true;

            if(inChannel !=null){
                inChannel.close();
            }
            if(outChannel !=null){
                outChannel.close();
            }
        } catch (IOException e){
            Log.d(TAG, "Unable to transfer file IOException: " + e.getMessage());
        } catch (Exception e){
            Log.d(TAG, "Unable to transfer file Exception: " + e.getMessage());
        }
        return flag;
    }

スタックトレース:

transferFile() Unable to transfer file Exception: java.nio.channels.NonWritableChannelException
at java.nio.FileChannelImpl.checkWritable(FileChannelImpl.java:85)
at java.nio.FileChannelImpl.transferTo(FileChannelImpl.java:399)
at com.test.activity.TestActivity$ExportDBTask.transferFile(TestActivity.java:250)
at com.test.activity.TestActivity$ExportDBTask.doInBackground(TestActivity.java:187)
at com.test.activity.TestActivity$ExportDBTask.doInBackground(TestActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)

TestActivity.java:250は、inChannel.transferTo(0、inChannel.size()、outChannel);に対応します。

4

3 に答える 3

3

これは、時間に応じてデータベースをアプリのSDカードに保存するために使用している例です。これは、さまざまな理由で(少なくとも私の状況では)データベースの異なるコピーが必要になる場合があるためです。

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

   Calendar c = Calendar.getInstance();
   int year = c.get(Calendar.YEAR);
   int month = c.get(Calendar.MONTH) + 1;
   int day = c.get(Calendar.DAY_OF_MONTH);
   int hours = c.get(Calendar.HOUR);
   int minute = c.get(Calendar.MINUTE);
   int second =  c.get(Calendar.SECOND);

   String currentDBPath = "/data/your.package.name/databases/database.sqlite";
   String backUpSystemData = "myDatabase-" + year + "-" + month + "-" + day + "-" + hours + "-" + minute + "-" + second + ".sqlite";
   File currentDB = new File(data, currentDBPath);
   File path = new File(sd + "/.MyDatabase/Database/");
   if(!path.exists()){
       path.mkdirs();
   }
   File backupDB = new File(path, backUpSystemData);
   FileChannel src = new FileInputStream(currentDB).getChannel();
   FileChannel dst = new FileOutputStream(backupDB).getChannel();
   dst.transferFrom(src, 0, src.size());
   src.close();
   dst.close();

また、で宛先としてFileInputStreamを使用しているコードについては、実際にストリームに書き込めるように、outChannelそれを使用して変更してみてください。outChannel = new FileOutputStream(dest).getChannel();

于 2013-03-01T14:13:49.843 に答える
1

ああ、問題が見つかりました。

outChannel = new FileInputStream(dest).getChannel();

これは次のようになります。

outChannel = new FileOutputStream(dest).getChannel();
于 2013-03-01T14:17:30.140 に答える
0

携帯にメモリーカードはありますか?

それ以外の場合、メモリカードが携帯電話にある場合は、マウントされているかどうかを確認してください。

また、別の可能性として、SDカードにファイルを書き込む権限がありません。

これがお役に立てば幸いです。

あなたはあなたのコードで間違ったことをしました。inChannel = new FileInputStream(src).getChannel(); outChannel = new FileInputStream(dest).getChannel();

これは、書き込み目的ではなく、読み取り目的です。FileoutputSreamとして変更する必要があります。

于 2013-03-01T14:35:41.590 に答える