Java 代码未将数据库写入SD卡

Java 代码未将数据库写入SD卡,java,android,sqlite,android-sdcard,Java,Android,Sqlite,Android Sdcard,我正在使用以下代码将数据库的副本导出到SD卡 public class AgUtility extends AgActivity{ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.utility); try { backupDatabase(getBaseContext());

我正在使用以下代码将数据库的副本导出到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();
}
}
代码似乎工作正常,没有任何错误。第一个Toast显示正确的数据库名称,第二个Toast显示输出目录应该是mnt/sdcard/student,第三个显示最终目标应该是mnt/sdcard/student/TodaysStudentTest.db3

在那片烤面包片消失后,什么都没有,最后的烤面包片就再也不会出现了

在我的舱单上我有

我正在三星平板电脑上测试,而不是在模拟器上,我也在DroidX上运行过,结果相同,没有错误,但没有创建文件夹

你知道我做错了什么吗? 短暂性脑缺血发作

我正在使用的权限是

     <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"/>
这表明我应该能够读和写,所以我的写作方式有问题。我把这个也添加到了文本中

       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()失败。

尝试在尝试写入之前手动创建文件

重写

这里是一种处理数据库文件的不同方法,不使用SQL本身或循环缓冲区

注意:这实际上并没有复制到SD卡,备份存储在原始数据库文件夹中(我喜欢这个文件夹,因为您不需要写入外部存储权限)

公共类文件IO扩展活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBHelper db=新的DBHelper(this);
试试{
copyFile();
}捕获(ioe异常ioe){
ioe.printStackTrace();
}最后{
日志i(“主要”、“完整”);
db.close();
完成();
}
}
public void copyFile()引发IOException{
File data=Environment.getDataDirectory();
String state=Environment.getExternalStorageState();
/*先创建文件
FileOutputStream created=openFileOutput(“copyFile.db”,模式为世界可读);
created.close();
*/
字符串currentDBPath=“/data//databases/data.db”;
字符串backupDBPath=“/data//databases/copyByFile.db”;
File currentDB=新文件(数据,currentDBPath);
File backupDB=新文件(数据,backupDBPath);
if(currentDB.exists()){
FileChannel src=newfileinputstream(currentDB).getChannel();
FileChannel dst=新的FileOutputStream(backupDB).getChannel();
transferFrom(src,0,src.size());
src.close();
dst.close();
}
其他的
Log.i(“主要”,“当前数据库不存在”);
}
}

请确保在使用mkdir()时已创建名为“student”的文件夹。它将通过抽象路径名创建目录。因此,如果文件夹“student”不存在,它将不会创建新文件夹。。或者尝试使用mkdirs()。如有必要,它将创建父文件夹。

记住检查拼写很重要。uses权限被错误地拼写为uses premission,我已经读了很多次代码,我想怎么读就怎么读。宝贵的教训,走开,休息一下。

由于某些原因,我不能写入sd卡,这在两台机器上都发生了文件sd=Environment.getExternalStorageDirectory();如果(sd.canWrite()){返回一个falseYes,我已经检查了好几次,但当我在手机和平板电脑的“管理应用”中查看该应用时,它不会显示为权限之一。在硬件控制下,它只列出拍摄的照片和视频。by design mkdirs()不抛出异常它只返回设计为真或假的异常。它只抛出没有细节的securityexception或空指针异常,这两个异常都没有出现在我的logcat中,所以我不知道如何使用它来帮助发现问题。只是出于好奇,为什么要在logcat语句中创建一个目录不要使用?
Log.d(“MAKE DIR”,dbFile.mkdir()+”)
我将其更改为与上面的行匹配,我试图查看mkdir是否正常工作。我找到了一个简化的方法,请参阅我的更新。我插入了一个try-catch,并能够发现它没有创建文件夹-会不会有问题,因为两台目标机器都与我的开发机器相连?我感到困惑。我甚至尝试过从AppMarketplace下载它,它只是没有创建目标文件夹和文件。你在使用哪些权限?(+1用于可执行代码)Sam,我将这些附加到我的原始帖子中,我正在阅读其中的详细信息,其中详细说明了标准Java IO为什么不能在Android上工作以及如何在Android上工作。我已将代码更改为mkdirs()并测试了文件夹的存在性,结果发现该文件夹不存在,但即使是mkdirs()也会失败。它会引发异常吗?
       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();  
        }
public class FileIO extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DBHelper db = new DBHelper(this);

        try { 
            copyFile();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {
            Log.i("Main", "Complete");
            db.close();
            finish();
        }
    }

    public void copyFile() throws IOException {
        File data = Environment.getDataDirectory();
        String state = Environment.getExternalStorageState();

        /* Create file first
            FileOutputStream created = openFileOutput("copyFile.db", MODE_WORLD_READABLE);
            created.close();
        */

        String currentDBPath = "/data/<your_path>/databases/data.db";
        String backupDBPath = "/data/<your_path>/databases/copyByFile.db";
        File currentDB = new File(data, currentDBPath);
        File backupDB = new File(data, backupDBPath);

        if (currentDB.exists()) {
            FileChannel src = new FileInputStream(currentDB).getChannel();
            FileChannel dst = new FileOutputStream(backupDB).getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();
        }
        else
            Log.i("Main", "Current db does not exist");
    }
}