2009-06-28 10 views
32

Już się dowiedziałem, że nie ma sposobu, aby spakować pliki w pliku .apk i mieć je na/sdcard, najlepszą opcją do tej pory jest pobieranie dużych plików przy pierwszym uruchomieniu. Natknąłem się na samouczek mówiący, jak spakować sqlite db z apk, a następnie skopiować go, aby można było uzyskać do niego dostęp za pomocą SQLiteDatabase (w ten sposób podwajając potrzebną przestrzeń, a nie używając w ogóle/sdcard).Czy mogę pobrać bazę danych SQLite/sdcard i uzyskać do niej dostęp z mojej aplikacji na Androida?

http://developer.android.com/guide/topics/data/data-storage.html#db mówi, że wszystkie bazy danych MUSZĄ znajdować się w/data/data/nazwa_pakietu/bazy danych.

Czy to naprawdę tak? Czy istnieje sposób, aby oszukać framework do otwierania bazy danych umieszczonej na partycji/sdcard? Czy istnieje sposób użycia innego opakowania/struktury java SQLite w celu uzyskania dostępu do takich baz danych?

Jeśli odpowiedź na powyższe pytanie brzmi "Nie", jakie mam inne opcje? Moje dane są bardzo dobrze reprezentowane w modelu relacyjnym, ale są po prostu zbyt duże, ponadto chcę je aktualizować bez konieczności ponownej instalacji/aktualizacji całej aplikacji.

+1

Wspomniałeś „Ja przyszedłem po drugiej stronie tutorial mówiąc jak połączą się z db sqlite apk, a następnie skopiować go ..”. Czy masz wskaźnik do tego zasobu? – Ichorus

+1

@Ichorus - Myślę, że to właśnie on może odnosić się do - http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ –

Odpowiedz

44

Pewnie, że możesz. Dokumenty są nieco sprzeczne na ten temat, ponieważ również mówią, że nie są narzucane żadne ograniczenia. Myślę, że powinni powiedzieć, że względne ścieżki odnoszą się do powyższej lokalizacji, a dbs są prywatne. Oto kod chcesz:

File dbfile = new File("/sdcard/mydb.sqlite"); 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 
System.out.println("Its open? " + db.isOpen()); 
+2

Następnie możemy uzyskać dostęp do tej bazy danych plik ze wszystkich działań w aplikacji? Nie mogłem tego robić konwencjonalnie !! –

+1

Dzięki Adam. I nie zapomnij dodać tego pozwolenia: w twoim AndroidManifest.xml –

+0

@Ashik: Nie rozumiem, dlaczego możesz " t uzyskać dostęp do innych działań. Mamy wiele opcji - prześlij otwarty obiekt db SQLiteDatabase do wymaganego działania lub przechowuj swój obiekt db w statycznym pliku referencyjnym. To powinno to zatuszować. –

1

tylko pomysł:

  • można umieścić database.db do folderu aktywów.

  • jeśli plik database.db jest większy niż 2 MB system jest w stanie go skompresować, więc trzeba drugi opcje

  • można zmienić nazwę swoją database.db np database.jit lub database.mp3 - które nie są kompresowane, niż przy pierwszym uruchomieniu można zmienić jego nazwę na database.db

7

Spróbuj tego:

String dir = Environment.getExternalStorageDirectory().getPath() 
File dbfile = new File(dir+"/mydb.sqlite"); 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 
System.out.println("Its open? " + db.isOpen()); 
1

Udostępniam następny kod. Deklarują opcionesMenu Vector<String>

Vector <String> opcionesMenu = new Vector<String>(); 
// the database is SDCard. I saw the code to Blackberry (net.rim) 
String rutaDB = "/storage/extSdCard/Android/databases/Offshore.db"; 


    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(rutaDB, null); 

    Cursor cursor = db.rawQuery("SELECT Codigo, Nombre FROM Ruta ORDER BY Codigo, Nombre", null); 

    if (cursor.moveToFirst()) 
    { 
     do 
     { 
      opcionesMenu.add(cursor.getString(0) + " - " + cursor.getString(1)); 
     } while(cursor.moveToNext()); 
    } 

    db.close(); 
Powiązane problemy