Mam bazę danych SQLite w systemie Android i używam ContentProvider
do obsługi operacji, które są utrzymywane w tabeli z kwalifikatorem UNIQUE w kolumnie.Czy można polegać na SQLiteConstraint i pozwolić SQLite na sprawdzanie? Czy jest haczyk?
Problem:
Jednak, kiedy insert
zduplikowane wartości w bazie danych, nie złamię kod per se, ale nadal pluje tysiące SQLiteConstraintException
linii dziennika, a do mojego użytkownika, po prostu czuje się jak zanieczyszczający Log, coś nieokrzesanego. Próbowałem przechwycić wyjątek tylko po to, aby eksperymentować, ale nadal się loguje.
Pytanie:
Tak, jak mogę milczeć te linie dziennika? Czy to w ogóle jest możliwe?
Proszę przeczytać poniższy komentarz, aby zadać pytanie.
Błąd:
kolumna Czas ma UNIQUE
ograniczenia:
Error inserting Factor=2.0 Time=1325375465000 Extra=none
android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1549)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)
at mypackage.myapp.provider.DataProvider.bulkInsert(DataProvider.java:353)
at android.content.ContentProvider$Transport.bulkInsert(ContentProvider.java:179)
at android.content.ContentResolver.bulkInsert(ContentResolver.java:646)
at mypackage.myapp.service.MyService.onHandleIntent(MyService.java:96)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.os.HandlerThread.run(HandlerThread.java:60)
czuję, że to wszystko oznacza, że to, co staram się robić to leniwy sposób, aby odzyskać od powtórzoną wkładką na unikalność, stąd „matowy” czuć w dzienniku. Prawdopodobnie lepiej naprawię to, co tworzy zduplikowane wpisy (i wywołuję wstawki) na początek. Jestem za gładkością. Ale to rodzi pytanie (do mnie): dlaczego nie możemy po prostu bezpiecznie "odciążyć" pracy do sprawdzania ograniczeń i pozwolić jej na niepowodzenie w sposób logiczny? Na wszelki wypadek ... może oczekujemy duplikatów ... więc nie ma się czym martwić. Może nasze źródło danych, poza naszą kontrolą, jest wadliwe na początek ... – davidcesarino
Komentowanie po udzieleniu odpowiedzi: jak już powiedziałem, byłem leniwy celowo, dla celów tego pytania, ponieważ starałem się nie kodować czeków i zostaw to dla SQLite zastanawiające się nad 1) bezpieczeństwem (współbieżność), 2) wydajnością (czy jest lepiej/szybciej niż ja na tym)? a także 3) praktycznie (mniej kodu). Jednak niektóre rzeczy przykuły moją uwagę (liczba wierszy wstawiania), więc zaimplementowałem sprawdzanie duplikatów oprócz ograniczeń. W każdym razie, byłem bardzo zadowolony z mojego kodu dotyczącego (1). Pamiętaj, że czytając to pytanie. – davidcesarino
Jeśli nie używasz android.util.Zaloguj się, to dlaczego martwisz się o błędy w logowaniu do użytkownika? –