2012-07-25 18 views
16


Czytałem, przeglądałem, dużo szukałem, wielokrotnie przeplatałem się w tę iz powrotem i udało mi się zawęzić problem tak bardzo, jak tylko mogłem.Używanie sqlite android w pamięci

Jedyne, czego nie rozumiem, to jak w pełni korzystać z bazy danych SQLite w pamięci.

Oto moja sytuacja - mam zaszyfrowaną bazę SQLite, którą odszyfrowuję podczas ładowania mojej aplikacji (ta część działa na pewno). Moja klasa, która współdziała z bazą danych, działa na pewno za pomocą zwykłej bazy danych. W skrócie, wszystko jest bezbłędne dzięki zwykłemu DB, które jest ładowane z wewnętrznej pamięci telefonu, ale nie jestem pewien, jak i gdzie przechowywać odszyfrowaną bazę danych w pamięci, aby mogła zostać zinterpretowana jako normalna DB.

Chyba powinienem umieścić null zamiast nazwy w super(context, null, null, 3); i używać :memory: zamiast ścieżki w SQLiteDatabase.openDatabase(), ale wciąż nie w pełni zrozumieć. Mówi, że nie może znaleźć tabeli android_metadata, ale jestem pewien, że baza danych jest taka jaka powinna być.

nadzieję, że było jasne w tej sprawie :)

+0

Tried [SQLCipher] (http://sqlcipher.net/sqlcipher-for-android/)? – Jens

+0

Nie zastanawiałem się zbytnio. Nie znalazłem go, kiedy po raz pierwszy szukałem, więc opracowałem własne, dwuetapowe "szyfrowanie". Dzięki za link, przyjrzę się. Czy możesz mi powiedzieć, jak bezpieczny jest SQLCipher i czy kompresuje dane? – Grandpa

+0

256-bitowe szyfrowanie AES jest w porządku - i nie będziesz prawdopodobnie sam dokonywał lepszej implementacji. – Jens

Odpowiedz

24

SQLiteOpenHelper() stworzy bazę danych w pamięci, jeśli name jest null. Zwróć uwagę, że zostanie on utworzony po wywołaniu getWritableDatabase().

Następnie należy wprowadzić swoje dane.

6

Ty (lub ramy) stworzenie bazy danych za pomocą ONE z następujących czynności:

  • SQLiteDatabase.create()
  • SQLiteDatabase.openDatabase()
  • SQLiteDatabase.openOrCreateDatabase()

Pierwsza opcja jest jedynym sposobem utworzyć bazę danych tylko do pamięci, dwie pozostałe otworzyć lub utworzyć plik bazy danych.

konsekwencji, jeśli używasz SQLiteOpenHelper() i zdać name jak null ramy zwraca SQLiteDatabase.create(null), więc dostaniesz bazę danych, która żyje tylko w pamięci (obumrze gdy close() nazywa). Nie ma potrzeby również wywoływać jednej z innych metod bezpośrednich. Zamiast tego zadzwoń pod numer getReadableDatabase() lub getWritableDatabase() ze swojego pomocnika.

+0

ok, jak używać bazy danych po wywołaniu 'myDatabase = SQLiteDatabase.create (null);'?Mam odszyfrowane DB jako surowe bajty w innej klasie, w jaki sposób scalić te bajty w uchwyt DB, który został utworzony? – Grandpa

+0

Nie wierzę, że program sqlite3 obsługuje "otwieranie": pamięci: bazy danych z istniejącego obiektu typu blob, więc interfejsy API w systemie Android, aby to zrobić, również nie istnieją. Najlepszym wyjściem może być przekazanie odszyfrowanej bazy danych do pliku, w którym można go otworzyć przy użyciu poprawnej ścieżki za pomocą 'openDatabase()'. Jeśli nie chcesz, aby odszyfrowana baza danych była utrwalana, możesz skopiować dane do wersji tylko do pamięci za pomocą zapytań/wstawień, a następnie zamknąć/usunąć wersję pliku. – Devunwired

+0

@Devunwired, kiedy mówisz "umiera kiedy' close() 'jest nazywane", czy odnosisz się do 'SQLiteOpenHelper.close()', lub 'SQLiteDatabase.close()'? Czy zamknięcie połączenia z bazą danych (przez 'SQLiteDatabase.close()') spowoduje zniszczenie bazy danych? – sotrh

0

Musisz zachować ostrożność używając pamięci, ponieważ dane zostaną utracone po utraceniu połączenia db. Upewnij się, że wystąpienie db nie zostały zamknięte

https://www.sqlite.org/inmemorydb.html