2013-04-12 5 views
5

Pracuję nad problemem, w którym muszę dołączyć jedną bazę danych sqlite do drugiej. Jedna z baz danych jest tworzona przez moją aplikację, a druga jest pobierana ze zdalnego serwera. Wolałbym uzyskać go w legalnym formacie danych (np. JSON), ale nie mogę kontrolować tego aspektu.Nie można ustawić kodowania SQLiteDatabase na coś innego niż UTF-8

Problem polega na tym, że kodowanie dla pobranego pliku sqlite to UTF-16le. Lokalny plik to UTF-8 (domyślny system Android). Mogę odczytać oba pliki dobrze, ale SQLite zezwala tylko na operacje ATTACH, gdy kodowanie jest zgodne.

Rozwiązanie powinno być tak proste jak kodowanie UTF-16le za każdym razem, gdy tworzę lokalną bazę danych, ale wygląda na to, że kodowanie jest zawsze ustawione zanim otrzymam obiekt bazy danych i nie mogę go zmienić. Używam SQLiteOpenHelper i zakłada się, że wszystkie oświadczenia Pragma powinno się zdarzyć w onConfigure() tak:

@Override 
public void onConfigure(SQLiteDatabase db) { 
    db.execSQL("PRAGMA encoding = \"UTF-16le\""); 
} 

Kiedy sprawdzić kodowanie po tym momencie, to zawsze UTF-8.

Log.d(TAG, DatabaseUtils.dumpCursorToString(db.rawQuery("PRAGMA encoding", null))); 

wynik:

04-12 11:10:07.116: D/MainActivity(10743): >>>>> Dumping cursor [email protected] 
04-12 11:10:07.116: D/MainActivity(10743): 0 { 
04-12 11:10:07.116: D/MainActivity(10743): encoding=UTF-8 
04-12 11:10:07.116: D/MainActivity(10743): } 
04-12 11:10:07.116: D/MainActivity(10743): <<<<< 

Próbowałem nawet stworzenie bazy danych w pamięci i ustawienie kodowania, ale to zawsze informuje UTF-8 potem:

SQLiteDatabase db = SQLiteDatabase.create(null); 
db.execSQL("PRAGMA encoding = \"UTF-16le\""); 

jestem trochę zdezorientowany, ponieważ mogę otworzyć te zakodowane w UTF-16le bazy danych i ich kodowanie jest zgłaszane poprawnie, ale nie mogę go utworzyć na urządzeniu. Czy jest jakiś sposób, aby ustawić kodowanie bazy danych podczas jej tworzenia?

+0

Narzędzia wiersza poleceń SQLite umożliwiają tworzenie bazy danych w trybie UTF-16. [Ta odpowiedź] (http://stackoverflow.com/a/21348574/53212) wyjaśnia, w jaki sposób. – thomasrutter

Odpowiedz

0

Przyszedł z kludgy rozwiązanie. Zasadniczo mam pusty plik bazy danych UTF-16le w moim folderze zasobów. Kiedy tworzę nową bazę danych, kopiuję ten plik ponad (w moim SQLiteOpenHelper) i robię wszystko normalnie po tym.

1

Zgodnie z this i this Android sqlite obsługuje tylko UTF-8 i UTF-16.

Czy to pomaga? Yaron

+0

Mogę otwierać i pomyślnie wyszukiwać baz danych UTF-16le, które zostały utworzone poza aplikacją, więc obsługa kodowania nie jest problemem. Po prostu nie mogę z powodzeniem ustawić kodowania nowej bazy danych. – Krylez