2012-04-17 53 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

重要的是要记住检查拼写。使用权限被错误拼写为使用权限,我已经阅读了许多次代码,因此我按照自己的意愿阅读了代码。宝贵的教训,走开并休息一下。