2013-04-02 46 views
0

我正在試圖使備份功能在我的應用程序,但它給部隊密切錯誤備份數據庫到SD卡

任何一個可以給一些想法什麼是錯在我的代碼

請幫我出

這裏是我的代碼

public class Mydatabase { 

private String appName = ""; 
    private String packageName = ""; 
    public static final String DATABASE_NAME = "data.db"; 
    public boolean backup() { 
    boolean rc = false; 

    boolean writeable = isSDCardWriteable(); 
    if (writeable) { 
     File file = new File(Environment.getDataDirectory() + "/data/" + packageName + "/databases/" + DATABASE_NAME); 

     File fileBackupDir = new File(Environment.getExternalStorageDirectory(), appName + "/backup"); 
     if (!fileBackupDir.exists()) { 
     fileBackupDir.mkdirs(); 
     } 

     if (file.exists()) { 
     File fileBackup = new File(fileBackupDir, DATABASE_NAME); 
     try { 
      fileBackup.createNewFile(); 
      FileUtils..copyFile(file, fileBackup); 
      rc = true; 
     } catch (IOException ioException) { 
      // 
     } catch (Exception exception) { 
      // 
     } 
     } 
    } 

    return rc; 
    } 

    private boolean isSDCardWriteable() { 
    boolean rc = false; 

    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     rc = true; 
    } 

    return rc; 
    } 

    public Mydatabase(final Context context, final String appName) { 
     this.appName = appName; 
     packageName = context.getPackageName(); 
    } 

}

這是我的日誌

04-03 00:39:18.595: E/AndroidRuntime(674): FATAL EXCEPTION: main 
04-03 00:39:18.595: E/AndroidRuntime(674): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.neelrazin.noteit/com.neelrazin.noteit.Mydatabase}: java.lang.InstantiationException: com.neelrazin.noteit.Mydatabase 
04-03 00:39:18.595: E/AndroidRuntime(674): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569) 
04-03 00:39:18.595: E/AndroidRuntime(674): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
04-03 00:39:18.595: E/AndroidRuntime(674): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
04-03 00:39:18.595: E/AndroidRuntime(674): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
04-03 00:39:18.595: E/AndroidRuntime(674): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-03 00:39:18.595: E/AndroidRuntime(674): at android.os.Looper.loop(Looper.java:123) 
04-03 00:39:18.595: E/AndroidRuntime(674): at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-03 00:39:18.595: E/AndroidRuntime(674): at java.lang.reflect.Method.invokeNative(Native Method) 
04-03 00:39:18.595: E/AndroidRuntime(674): at java.lang.reflect.Method.invoke(Method.java:507) 
04-03 00:39:18.595: E/AndroidRuntime(674): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-03 00:39:18.595: E/AndroidRuntime(674): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-03 00:39:18.595: E/AndroidRuntime(674): at dalvik.system.NativeStart.main(Native Method) 
04-03 00:39:18.595: E/AndroidRuntime(674): Caused by: java.lang.InstantiationException: com.neelrazin.noteit.Mydatabase 
04-03 00:39:18.595: E/AndroidRuntime(674): at java.lang.Class.newInstanceImpl(Native Method) 
04-03 00:39:18.595: E/AndroidRuntime(674): at java.lang.Class.newInstance(Class.java:1409) 
04-03 00:39:18.595: E/AndroidRuntime(674): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
04-03 00:39:18.595: E/AndroidRuntime(674): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561) 
04-03 00:39:18.595: E/AndroidRuntime(674): ... 11 more 
+0

你爲什麼要編輯你的代碼?它應該是可讀的 – Pragnani

+0

你是否已將寫入權限添加到清單中? –

+0

否 什麼權限 我不知道... – neel

回答

0

的跟蹤點手指的事實,你正在試圖啓動一個名爲ActivityMydatabase。正如我們從您的代碼段中看到的,Mydatabase不會延伸Activity。該系統正在尋找一個Activity發射,而不是從Object派生的類。

+0

我從此網站獲取此代碼 有沒有擴展活動 – neel

+0

我建議你閱讀關於編程的Android。 – James

+0

你不能幫助我嗎? – neel

3

你似乎有點失落。 這是一個備份數據庫的功能方法,您可以將它放在任何類中。

public static void backupDatabase() throws IOException { 
    //Open your local db as the input stream 
    String inFileName = "/data/data/com.android.exemple/databases/databename.db"; 
    File dbFile = new File(inFileName); 
    FileInputStream fis = new FileInputStream(dbFile); 

    String outFileName = Environment.getExternalStorageDirectory()+"/database.db"; 
    //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(); 
} 

您需要在您的清單中加入這一行的應用單元

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

前不要忘記在inFileName變量,並在這兩個地方的數據庫名稱更改包名。

+0

@ Stephane:我試着按照你的說法,但沒有發生任何事情。當點擊我的「BackUp」按鈕時,它只是顯示一個簡單的屏幕。你能解釋爲什麼會發生這種情況嗎? – neel

+0

此metof不顯示屏幕上的任何內容,但如果您查看SD卡內存的根目錄,則應該看到文件database.db。 –