Вътрешно хранилище на Android Path

Имам проблем с вътрешния път за експортиране на базата данни. Дневникът казва, че това е грешен път.

File sd = Environment.getExternalStorageDirectory();
            File data = Environment.getDataDirectory();
           FileChannel source=null;
           FileChannel destination=null;
           String cartella = (getString(R.string.app_name));
           String currentDBPath = "/data/"+getPackageName()+"/cartella/"+"Backup.db";
           String backupDBPath = "/cartella/Backup.db";

           File currentDB = new File(data, currentDBPath);
           File backupDB = new File(sd, backupDBPath);
           try {
                source = new FileInputStream(currentDB).getChannel();
                destination = new FileOutputStream(backupDB).getChannel();
                destination.transferFrom(source, 0, source.size());
                source.close();
                destination.close();
                Toast.makeText(this, "DB Exported!", Toast.LENGTH_LONG).show();
            } catch(IOException e) {
                e.printStackTrace();
                  Toast toast = Toast.makeText(getApplicationContext(),(R.string.Toast_export_errore), Toast.LENGTH_SHORT);
                     toast.show();

Дневник

01-20 08:55:14.757: W/System.err(1383): java.io.FileNotFoundException: /data/data/info.androidhive.slidingmenu/cartella/Backup.db: open failed: ENOENT (No such file or directory)

01-20 08:55:14.787: W/System.err(1383): в libcore.io.IoBridge.open(IoBridge.java:409) 01-20 08:55:14.787: W/System.err(1383) : в java.io.FileInputStream.(FileInputStream.java:78) 01-20 08:55:14.827: W/System.err(1383): в main.Impostazioni.Esporta(Impostazioni.java:334) 01-20 08 :55:14.827: W/System.err(1383): в java.lang.reflect.Method.invokeNative(Native Method) 01-20 08:55:14.827: W/System.err(1383): в java.lang .reflect.Method.invoke(Method.java:525) 01-20 08:55:14.827: W/System.err(1383): в android.view.View$1.onClick(View.java:3628) 01-20 08:55:14.857: W/System.err(1383): при android.view.View.performClick(View.java:4240) 01-20 08:55:14.857: W/System.err(1383): при android .view.View$PerformClick.run(View.java:17721) 01-20 08:55:14.877: W/System.err(1383): при android.os.Handler.handleCallback(Handler.java:730) 01- 20 08:55:14.877: W/System.err(1383): в android.os.Handler.dispatchMessage(Handler.java:92) 01-20 08:55:14.887: W/System.err(1383): в android.os.Looper.loop(Looper.java:137) 01-20 08:55:14.898: W/System.err(1383): в android.app.ActivityThread.main(ActivityThread.java:5103) 01-20 08:55:14.927: W/System.err(1383): в java.lang.reflect.Method.invokeNative(Собствен метод) 01-20 08:55:14.927: W/System.err(1383): в java. lang.reflect.Method.invoke(Method.java:525) 01-20 08:55:14.957: W/System.err(1383): на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java :737) 01-20 08:55:14.957: W/System.err(1383): в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 01-20 08:55:14.987: W /System.err(1383): в dalvik.system.NativeStart.main(Native Method) 01-20 08:55:14.987: W/System.err(1383): Причинено от: libcore.io.ErrnoException: неуспешно отваряне: ENOENT (Няма такъв файл или директория)


person user3160725    schedule 20.01.2014    source източник
comment
моля, публикувайте вашите регистрационни файлове   -  person Tapa Save    schedule 20.01.2014


Отговори (2)


Опитайте да замените:

File currentDB = new File(data, currentDBPath);

с:

File currentDB = getDatabasePath("Backup.db");

Твърдото кодиране на пътя на базата данни не е добра идея, тъй като не е гарантирано, че ще бъде еднакъв на всички устройства. Използването на getDatabasePath() ще върне пътя, по който е създадена базата данни. Така че, ако базата данни съществува, ще бъде върнат правилният път до нея.

РЕДАКТИРАНЕ:

За да възстановите база данни, която сте експортирали преди това, направете точно както направихте при експортирането. Единствената разлика е, че трябва да превключите източника и дестинацията, така че източникът вече да е пътят на архивния ви файл, а дестинацията вече да е пътят на файла на базата данни. След това базата данни ще бъде презаписана с архива:

source = new FileInputStream(backupDB).getChannel();
destination = new FileOutputStream(currentDB).getChannel();
person NigelK    schedule 20.01.2014
comment
Можете да използвате getParent() или getParentFile() за върнатия файл, за да получите директорията, в която се намира базата данни. Използването на getDatabasePath() коригира ли грешката ви? - person NigelK; 20.01.2014
comment
да, getDatabasePath () е добре. но бих искал съвет или добър пример за импортиране от sd карта. - person user3160725; 20.01.2014
comment
Моля, вижте моята редакция. Това е прост случай на копиране в обратна посока. - person NigelK; 20.01.2014

Is

/data/data/info.androidhive.slidingmenu/cartella/Backup.db

валиден път? Можете да използвате DDMS, за да проверите в данните на приложението си, че Backup.db съществува

person Nut Tang    schedule 20.01.2014