2010-06-02 14 views
19

Mam natywną aplikację Android 2.1, która obsługuje widok WWW. Załaduję stronę zawierającą javascript korzystającą z funkcji LocalStorage. Gdy aplikacja działa, localStorage działa dobrze. Gdy niektórzy użytkownicy opuszczą aplikację i uruchomią ją ponownie, wszystkie wartości znikną. Nie widzę tego problemu w moich Motrola Droid lub Sprint EVO, ale istnieje raport użytkowników w tej dziedzinie.Moja aplikacja HTML na Androida traci wartości przechowywane w localStorage po wyłączeniu. Ktoś jeszcze widzi ten problem?

Czy ktoś wie, czego mi brakuje? Ustawiam następującą flagę na true.

settings.setDomStorageEnabled(true); 
+0

Czy wiesz, jakie urządzenia mają ten problem z aplikacją? Nie jestem świadomy problemu z tą funkcją, przynajmniej na urządzeniach z Androidem 2.x. – CommonsWare

+0

Wygląda na to, że kilka robotów Motoroli zawiedzie. Mam jeden, który przyszedł w/2.1 z fabryki i wydaje się, że działa dobrze. – Kevin

+0

http://stackoverflow.com/questions/4157184/android-making-webview-domstorage-persistant-after-app-closed – rdmueller

Odpowiedz

2
// Confimed on android 2.1 emulator 

// enable javascript localStorage 


WebSettings webSettings = myWebView.getSettings(); 

webSettings.setDomStorageEnabled(true); // localStorage 

// eg if your package 

// package www.myapp.whatever; 

// eg webSettings.setDatabasePath("/data/data/www.myapp.whatever/databases/"); 

webSettings.setDatabasePath("/data/data/packagename/databases/"); 

to działa

16

Aby lokalną pracę pamięci dla własnego WebView w Androidzie, musisz upewnić się, że WebView używa właściwego pliku, a lokalne przechowywanie jest włączona tak :

String packageName = "com.dongshengcn.android"; 
WebSettings settings = webView.getSettings(); 
settings.setJavaScriptEnabled(true); 
settings.setDatabaseEnabled(true); 
settings.setDatabasePath("/data/data/"+packageName+"/databases"); 
settings.setDomStorageEnabled(true); 

Gdzie "com.dongshengcn.android" należy zastąpić własną nazwą pacakge aplikacji na Androida.

+5

Hardcoding ścieżka nie jest właściwym rozwiązaniem. .getApplicationContext(). getDir ("bazy danych", kontekst.MODE_PRIVATE).getPath(); zamiast tego nadal będzie działać, jeśli ścieżka/data/data/nazwa_pakietu zmieni się wraz z nową wersją interfejsu API. – MrMaffen

4

trzeba tylko te dwie linie:

this.getSettings().setDomStorageEnabled(true); //enable to use "window.localStorage['my']='hello1'", in webview js on >= android 2.0 
this.getSettings().setDatabasePath("/data/data/"+this.context.getPackageName()+"/databases/"); //if no set or wrong path, variables disappear on killed 
10

Tylko kompletny dotychczasowe reakcje, które nie pozwalają, aby rozwiązać problem w moim przypadku.

Pracuję z systemem Android 4.1.1. Moja aplikacja korzysta z lokalnej pamięci w widoku Webview i otrzymuję ten sam problem, co w pierwotnym pytaniu: lokalna pamięć działa dobrze, dopóki nie zabiję aplikacji. W tym przypadku dane zostały utracone.

Przez inspirując mnie z poprzednich odpowiedzi, a zwłaszcza od @diyism, udało mi się rozwiązać mój problem z tym:

String databasePath = this.getApplicationContext().getDir("databases", Context.MODE_PRIVATE).getPath(); 
settingsMenu.setDatabasePath(databasePath); 

W rzeczywistości, jak napisano w setDatabasePath (dokumentacji): to function correctly, this method must be called with a path to which the application can write.

6

setDatabasePath() Metoda ta została zaniechana na poziomie API 19. Radzę używać locale przechowywania takiego:

webView.getSettings().setDomStorageEnabled(true); 
webView.getSettings().setDatabaseEnabled(true); 
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
    webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/"); 
}