2013-05-22 7 views
0

я получаю FATAL EXCEPTION: AsyncTask #2 в моем doInBackground: Не принимать во внимание String... urlActus, потому что я удалил за это сообщениеошибка при выполнении doInBackground()

protected Void doInBackground(String... urlActus) {   

    try { 

     myDbHelper.createDataBase(); 

    } catch (IOException ioe) { 

     throw new Error("Unable to create database"); 

    } 
} 

public void createDataBase() throws IOException{ 

    boolean dbExist = checkDataBase(); 

    if(dbExist){ 
     this.getWritableDatabase(); 
    } 
    dbExist = checkDataBase(); 
    if (!dbExist) { 
     this.getReadableDatabase(); 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 

} 

private static String DB_NAME = "externalDB"; 
DB_PATH="/data/data"+context.getPackageName()+"/databases/"; 


private void copyDataBase() throws IOException{ 


    InputStream myInput = myContext.getAssets().open(DB_NAME); 

    String outFileName = DB_PATH + DB_NAME; 

    OutputStream myOutput = new FileOutputStream(outFileName); //EROR LINE 

    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer))>0){ 
     myOutput.write(buffer, 0, length); 
    } 

    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

} 

Я не uderstand почему во время doInBackground, когда я пытаюсь строить ->OutputStream myOutput = new FileOutputStream(outFileName);

это мой LogCat Выход:

05-22 14:51:22.078: E/AndroidRuntime(8400): FATAL EXCEPTION: AsyncTask #2 
05-22 14:51:22.078: E/AndroidRuntime(8400): java.lang.RuntimeException: An error occured while executing doInBackground() 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at android.os.AsyncTask$3.done(AsyncTask.java:278) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at java.lang.Thread.run(Thread.java:856) 
05-22 14:51:22.078: E/AndroidRuntime(8400): Caused by: java.lang.Error: Error copying database 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at com.example.savingfiles.DatabaseHelper.createDataBase(DatabaseHelper.java:67) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at com.example.savingfiles.SplashActivity$Traitement.doInBackground(SplashActivity.java:81) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at com.example.savingfiles.SplashActivity$Traitement.doInBackground(SplashActivity.java:1) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at android.os.AsyncTask$2.call(AsyncTask.java:264) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-22 14:51:22.078: E/AndroidRuntime(8400):  ... 5 more 

у меня есть это исключение, какое решение я могу сделать, чтобы этого избежать?

+0

дону использовать «это» в фоновом режиме – Senthil

+0

делает ваш класс продлить SQLiteOpenHelper если так использовать activityname.this.getWritableDatabase() – Raghunandan

+0

Да мой класс продлить SQLiteOpenHelper SplashActivity.this.getWritableDatabase(); : не работает, потому что этот метод не определен в SplashActivity (где есть мой метод doInBackground) –

ответ

0

Я думаю, что, возможно, ваша проблема может быть столь же простым, как и то, что ваше имя файла, как представляется, будет построен неправильно:

DB_PATH="/data/data"+context.getPackageName()+"/databases/"; 

Оказывается, что вам не хватает косую черту между «данными» и ваше имя пакета:

DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 

Но на самом деле на один шаг лучше было бы не жестко закодировать путь вообще. Вместо этого используйте:

DB_PATH = context.getFilesDir().getAbsolutePath() + "/databases/"; 

Вы можете проверить my blog post о том, почему это важно, чтобы сделать это таким образом, вместо жесткого кодирования пути.

Одно окончательное предложение было бы в вашем блоке catch, не сбивать оригинал IOException, который вы ловите. Если вы хотите добавить какой-то контекст, это нормально. Но вместо throw new Error("Error copying database."), который довольно сложно отладить, попробуйте throw new IOException("Error copying database.", e), который также пройдет по исходному исключению, что значительно облегчит отладку.

+0

Во-первых, я думал, что это проблема, но когда я помещаю: DB_PATH = "/ data/data /" + context.getPackageName() + "/ databases /"; У меня есть это outuput в моем LogCat/data/data // databases/externalDB Я попробовал ваше решение, но у меня есть Невозможно создать экземпляр активности ComponentInfo {com.example.francebtp/com.example.savingfiles.SplashActivity}: java.lang.NullPointerException –

+0

Это неверно. Context.getFilesDir(). GetAbsolutePath() возвращает «data/data/your_package_context/files». ОСТОРОЖНО. – Jarvis

+0

@Pierre_S Я предполагаю, что вы пытаетесь использовать 'context' до того, как он был инициализирован. Убедитесь, что ваш код является подходящим местом, где 'context' является допустимым, а не null. –

0

Постарайтесь увидеть значение outFileName (регистрация или отладка), и вы увидите, что это неверно.

Другая рекомендация - не скрывать исходное исключение. Вы захватываете IOException, в котором есть реальная информация об ошибке, а затем вы не передаете его классу Error, поэтому вы теряете любую информацию о реальной причине сбоя (FileNotFound, проблема разрешения ...)

Просто используйте это:

 try { 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database",e); 
     } 

и оригинальное исключение будет регистрироваться в качестве вложенного исключения позволяет видеть реальную проблему.

Надеется, что это помогает

+0

Спасибо, это мой выход LogCat, 05-22 15: 30: 25.408: E/AndroidRuntime (9551): FATAL EXCEPTION: main 05-22 15: 30: 25.408: E/AndroidRuntime (9551): java.lang.RuntimeException: не удалось создать экземпляр активности ComponentInfo {com.example.francebtp/com.example.savingfiles.SplashActivity}: java.lang.NullPointerException –

+0

Не понимаю , это отличается от того, что было опубликовано в вопросе ?. Использование context.getFilesDir(). GetAbsolutePath(), как предлагается в другом ответе, должно быть способом. – richardtz

+0

Да, это другое, но начальное исключение начинается с первого, ни один из моих тестов logcat не появляется –

Смежные вопросы