2012-04-17 55 views
0

我正在使用以下代碼將我的數據庫的副本導出到我的SD卡。沒有將數據庫寫入SD卡的代碼

public class AgUtility extends AgActivity{ 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.utility); 
    try { 
     backupDatabase(getBaseContext()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
}   
public static void backupDatabase(Context context) throws IOException { 


    // Open your local db as the input stream 
    String inFileName = "data/data/com.agmanagement.todaysstudent/databases/todaysstudent.db"; 
    Toast.makeText(context, "FileName Is "+ inFileName, Toast.LENGTH_LONG).show(); 
    Log.i("The File In Is ", inFileName); 

    File dbFile = new File(inFileName); 
    FileInputStream fis = new FileInputStream(dbFile); 

    File outputDirectory = new File(
      Environment.getExternalStorageDirectory() + "/student/"); 
    outputDirectory.mkdir(); 
    Log.d("MAKE DIR", dbFile.mkdir() + ""); 
    String backupFileName = "/TodaysStudentTest.db3"; 
    String outFileName = outputDirectory + backupFileName; 
    Toast.makeText(context, "Database backup names is " + outFileName , Toast.LENGTH_LONG) 
    .show(); 

    // Open the empty db as the output stream 
    OutputStream output = new FileOutputStream(outFileName); 

    // transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = fis.read(buffer)) > 0) { 
     output.write(buffer, 0, length); 
    } 
    // Close the streams 
    output.flush(); 
    output.close(); 
    fis.close(); 

    Toast.makeText(context, "Database backup complete", Toast.LENGTH_LONG) 
      .show(); 
} 
} 

代碼似乎正常工作,因爲我沒有得到任何錯誤,先敬酒顯示正確的數據庫名稱,第二敬酒顯示輸出目錄應該mnt中/ SD卡/學生和第三節目最終的目標應該是mnt/sdcard/student/TodaysStudentTest.db3

之後Toast淡入淡出,沒有任何東西,最後的Toast從不出現。

在我的清單我有

我在三星平板,而不是在模擬器上測試此,我也對DroidX同樣的結果,沒有錯誤運行它,但沒有創建文件夾。

關於我在做什麼錯的任何想法? TIA

我使用的權限是

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.premission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.SET_DEBUG_APP" /> 
<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.READ_CALENDAR"/> 
<uses-permission android:name="android.permission.WRITE_CALENDAR"/> 

我在模擬器中運行時得到相同的結果 - 與DDMS看 - logcat的演出MAKE DIR失敗。

我測試過的狀態,這

 if (Environment.MEDIA_MOUNTED.equals(state)) { 
     // We can read and write the media 
     mExternalStorageAvailable = mExternalStorageWriteable = true; 
      Toast.makeText(getBaseContext(), "We Can Read And Write To The SDCARD", Toast.LENGTH_LONG).show(); 
      } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
     // We can only read the media 
       mExternalStorageAvailable = true; 
       mExternalStorageWriteable = false; 
       Toast.makeText(getBaseContext(), "We Can Read The SDCARD", Toast.LENGTH_LONG).show(); 
      } else { 
       // Something else is wrong. It may be one of many other states, but all we need 
       // to know is we can neither read nor write 
       mExternalStorageAvailable = mExternalStorageWriteable = false; 
       Toast.makeText(getBaseContext(), "We Can't read or write", Toast.LENGTH_LONG).show(); 
      } 

它表明我應該能夠讀取和寫入,所以有什麼問題怎麼我寫。我將此添加到文本

 boolean success = false; 
     if(!outputDirectory.exists()){ 
      Toast.makeText(getBaseContext(), "Folder Doesn't Exist ", Toast.LENGTH_LONG) 
      .show(); 
      success = outputDirectory.mkdirs(); 
     } 
     if (!success){ 
      Toast.makeText(getBaseContext(), "Folder Not Created ", Toast.LENGTH_LONG) 
      .show(); 
     } 
     else{ 
      Toast.makeText(getBaseContext(), "Folder Created ", Toast.LENGTH_LONG) 
      .show(); 
     } 

結果是文件夾不存在,然後mkdirs()失敗。

+0

只是出於好奇,你爲什麼要在你的logcat語句中創建一個目錄,你不使用? 'Log.d(「MAKE DIR」,dbFile.mkdir()+「」);' – Sam 2012-04-17 16:16:53

+0

我改變了回到上面的行,我試圖看看mkdir是否工作 – Hank 2012-04-17 17:16:42

+0

我找到了一個簡化的方法,看到我的更新。 – Sam 2012-04-17 21:19:06

回答

0

REWRITE

這是一個不同的方法來應對數據庫文件,而無需使用SQL本身或循環緩衝區。

注意:這實際上並沒有複製到SD卡,備份存儲在原始數據庫文件夾(我喜歡因爲你不需要 WRITE_EXTERNAL_STORAGE權限)。

+0

我已經插入了一個try-catch,並且能夠發現它沒有創建文件夾 - 會不會有問題,因爲這兩個目標機器都被綁定到我的開發機器上? – Hank 2012-04-17 16:18:26

+0

我很困惑。我甚至嘗試從應用程序市場下載它,它只是不創建目標文件夾和文件 – Hank 2012-04-17 16:34:49

+0

您使用哪些權限? (順便說一句,可執行代碼爲+1) – Sam 2012-04-17 16:44:45

0

嘗試在寫入文件之前手動創建文件。

+0

出於某種原因,我不被允許寫入SD卡,這是發生在兩臺機器 File sd = Environment.getExternalStorageDirectory(); if(sd.canWrite()){ 返回false – Hank 2012-04-17 16:03:15

+0

您有清單中的權限嗎? – 2012-04-17 16:07:13

+0

是的,我已經多次查看過,當我查看手機和平板電腦上的「管理應用」中的應用時,它並未顯示爲其中一個權限。在硬件控制下,它只列出拍照和錄像。 – Hank 2012-04-17 16:13:26

0

請確保您已經創建了名爲「student」的文件夾,因爲您使用的是mkdir()。它會創建目錄的抽象路徑名..所以如果文件夾「學生」不存在它不會創建新的文件夾..或嘗試,而不是mkdirs()。它將在必要時創建父文件夾。

+0

我已經將代碼更改爲mkdirs()並測試了文件夾的存在,結果發現文件夾不存在,但即使mkdirs()也失敗。 – Hank 2012-04-17 17:53:14

+0

是否拋出異常? – dreamcoder 2012-04-17 17:55:08

0

重要的是要記住檢查拼寫。使用權限被錯誤拼寫爲使用權限,我已經閱讀了許多次代碼,因此我按照自己的意願閱讀了代碼。寶貴的教訓,走開並休息一下。