-2
我在我的應用程序中有一個數據庫。我想將其從我的應用程序內部存儲備份或導出到外部(共享)存儲。我有以下代碼來實現目標。如何將數據庫從內部存儲備份到外部(共享)存儲
public void exportDB(){
File sd = Environment.getExternalStorageDirectory();
File data = Environment.getDataDirectory();
FileChannel source = null;
FileChannel destination = null;
File dbFile = context.getDatabasePath(SAMPLE_DB_NAME);
String currentDBPath = dbFile.toString();
String backupDBPath = SAMPLE_DB_NAME;
File currentDB = new File(data, currentDBPath);
File backupDB = new File(sd, backupDBPath);
if(sd.canWrite() && sd.canRead())
Toast.makeText(context, "sd can read and write", Toast.LENGTH_LONG).show();
else if(sd.canWrite() && !sd.canRead())
Toast.makeText(context, "sd cannot read but write", Toast.LENGTH_LONG).show();
else if(!sd.canWrite() && sd.canRead())
Toast.makeText(context, "sd can read but not write", Toast.LENGTH_LONG).show();
else
Toast.makeText(context, "sd cannot read and write", Toast.LENGTH_LONG).show();
try {
source = new FileInputStream(currentDB).getChannel();
destination = new FileOutputStream(backupDB).getChannel();
destination.transferFrom(source, 0, source.size());
source.close();
destination.close();
//Toast.makeText(this, "DB Exported!", Toast.LENGTH_LONG).show();
} catch(IOException e) {
e.printStackTrace();
}
}
我已經在清單
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
問題添加這兩種權限是我得到的是SD卡的選項錯誤是不可寫,而不是可讀從我的if else語句。
其次我在日誌中得到這個錯誤。
10-07 11:58:25.388 18913-18913/com.free W/System.err: java.io.FileNotFoundException: /data/data/user/0/com.free/databases/database.db (No such file or directory)
10-07 11:58:25.390 18913-18913/com.free W/System.err: at java.io.FileInputStream.open(Native Method)
10-07 11:58:25.392 18913-18913/com.free W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:146)
10-07 11:58:25.394 18913-18913/com.free W/System.err: at com.free.DatabaseManage.exportDB(DatabaseManage.java:56)
10-07 11:58:25.396 18913-18913/com.free W/System.err: at com.free.MainActivity.onNavigationItemSelected(MainActivity.java:773)
10-07 11:58:25.398 18913-18913/com.free W/System.err: at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:156)
10-07 11:58:25.400 18913-18913/com.khan.free W/System.err: at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
10-07 11:58:25.402 18913-18913/com.free W/System.err: at android.support.v7.view.menu.SubMenuBuilder.dispatchMenuItemSelected(SubMenuBuilder.java:88)
10-07 11:58:25.403 18913-18913/com.free W/System.err: at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156)
10-07 11:58:25.405 18913-18913/com.free W/System.err: at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969)
10-07 11:58:25.407 18913-18913/com.free W/System.err: at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:342)
10-07 11:58:25.409 18913-18913/com.free W/System.err: at android.view.View.performClick(View.java:6213)
10-07 11:58:25.411 18913-18913/com.free W/System.err: at android.view.View$PerformClick.run(View.java:23645)
10-07 11:58:25.413 18913-18913/com.free W/System.err: at android.os.Handler.handleCallback(Handler.java:751)
10-07 11:58:25.418 18913-18913/com.free W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
10-07 11:58:25.419 18913-18913/com.free W/System.err: at android.os.Looper.loop(Looper.java:154)
10-07 11:58:25.420 18913-18913/com.free W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6692)
10-07 11:58:25.421 18913-18913/com.free W/System.err: at java.lang.reflect.Method.invoke(Native Method)
10-07 11:58:25.422 18913-18913/com.free W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
10-07 11:58:25.423 18913-18913/com.khan.free W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
我不知道什麼和錯誤在哪裏。我該如何解決這個問題?
'destination.transferFrom'返回什麼? 'source.size()'的價值是什麼? – pskink
我怎麼檢查....我沒有調試,當調試到達這個聲明「源=新FileInputStream(currentDB).getChannel();」它會停止 – Dilazak
其在這裏崩潰... – Dilazak