2011-10-25 50 views
0

我一直在使用下面的代碼,但直觀地看到它不是太安全。它會在每個設備上完美地工作嗎?此代碼在第一次應用程序運行時將我的主數據庫(100 kB)複製到內部存儲器中。謝謝你的時間。這是將文件保存到內存的安全正確方法嗎?

private void CopyDBtoInternal() { 

    String path = "/data/data/com.myproject/databases/"; 
    String DB_DESTINATION = "/data/data/com.myproject/databases/sample.db"; 

    // Check if the database exists before copying 
    boolean initialiseDatabase = (new File(DB_DESTINATION)).exists(); 
    if (initialiseDatabase == false) { 

     //create folders 
     File db_folder = new File(path); 
     db_folder.mkdirs(); 

     AssetManager assetManager = getApplicationContext().getAssets(); 

     try { 
      InputStream is = assetManager.open("sample.db"); 

      // Copy the database into the destination 
      OutputStream os = new FileOutputStream(DB_DESTINATION); 
      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = is.read(buffer)) > 0){ 
       os.write(buffer, 0, length); 
      } 
      os.flush(); 

      os.close(); 
      is.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
      AlertDialog.Builder dialogo = new AlertDialog.Builder(AppGuiaDeBulas.this); 
      dialogo.setTitle("Alerta"); 
      dialogo.setMessage("It was not possible to save database. Error #001"); 
      dialogo.setNeutralButton("OK", null); 
      dialogo.show(); 
     } 
    } 

} 

回答

1

​​

如果您使用API​​等級8(升級Froyo)或更高,使用getExternalFilesDir()打開表示外部存儲目錄,你應該保存文件的文件。此方法接受一個類型參數,該參數指定所需的子目錄的類型,例如DIRECTORY_MUSIC和DIRECTORY_RINGTONES(傳遞null以接收應用程序文件目錄的根目錄)。如果需要,此方法將創建適當的目錄。通過指定目錄的類型,您可以確保Android的媒體掃描程序能夠正確地對系統中的文件進行分類(例如,鈴聲被識別爲鈴聲而不是音樂)。如果用戶卸載您的應用程序,則該目錄及其所有內容將被刪除。

如果您使用API​​ 7級或更低,使用getExternalStorageDirectory(),打開代表外部存儲的根文件。然後,您應該將數據寫入以下目錄:

/Android/data //文件/ 這是您的Java風格的包名稱,例如「com.example.android.app」。如果用戶的設備正在運行API Level 8或更高版本,並且它們將卸載您的應用程序,則該目錄及其所有內容將被刪除。

http://developer.android.com/guide/topics/data/data-storage.html#AccessingExtFiles

+0

對不起,忘了提,我使用API​​等級3爲我的應用程序一個更廣泛的用戶。我想將我的小型數據庫保存到內部存儲器而不是外部存儲器。或者這不是一個好習慣嗎? – Daniel

相關問題