2011-08-16 14 views
6

Obecnie używam języka ORMLite do pracy z bazą danych SQLite w systemie Android. W ramach tego pobieram garść danych z serwera zaplecza i chciałbym, aby te dane zostały dodane do bazy danych SQLite w dokładnie tym samym formacie, który znajduje się na serwerze zaplecza (tj. Identyfikatory są takie same, itp.) .Wstaw wiersz Androida/ORMLite z identyfikatorem

Moje pytanie brzmi: jeśli zapełnię mój obiekt do wpisania do bazy danych (nazwijmy to sprzętem), w tym pole generowany klucz/klucz podstawowy urządzenia za pomocą metody setId(), a następnie uruchomię funkcję DAO.create() z że wpis wyposażenia spowoduje, że identyfikator zostanie zapisany poprawnie? Próbowałem tego w ten sposób i wydaje mi się, że tak nie było. W takim przypadku spróbuję ponownie i będę szukał innych problemów, ale przy pierwszych kilku przejazdach nad kodem nie mogłem go znaleźć. Więc zasadniczo, jeśli zadzwonię do DAO.create() na obiekcie bazy danych z zestawem identyfikacyjnym, czy ten ID zostanie wysłany do bazy danych, a jeśli tak nie jest, w jaki sposób mogę wstawić wiersz z już wypełnioną wartością klucza głównego?

Dzięki!

Odpowiedz

13

@Femi jest, że obiekt może być albo wygenerowany-id lub ID, lecz nie obu. Problem jest większy niż to, jak ORMLite przechowuje obiekt, ale musi również pasować do schematu, w którym została wygenerowana baza danych.

obsługuje opcję allowGeneratedIdInsert=true do adnotacji @DatabaseField, która pozwala na takie zachowanie. Nie jest to obsługiwane przez niektóre typy baz danych (na przykład Derby), ale działa pod kontrolą systemu Android/SQLite.

Dla potomności można również utworzyć 2 obiekty, które mają tę samą tabelę - jedną z wygenerowanym identyfikatorem i jedną bez. Następnie możesz wstawić przy użyciu generowanego identyfikatora Dao, aby uzyskać to zachowanie, a drugie Dao, aby przyjąć wartość identyfikatora ustawioną przez wywołującego. Oto another answer talking about that. Problem dla Ciebie brzmi tak, że stworzy to wiele dodatkowych DAO.

Jedynym innym rozwiązaniem jest , a nie użycie identyfikatora do swoich celów. Niech baza danych wygeneruje identyfikator, a następnie dodatkowe pole, którego używasz ustawiane zewnętrznie dla twoich celów. Wymuszenie identyfikatora bazy danych w pewnych okolicznościach wydaje mi się złym wzorcem.

4

Od http://ormlite.com/docs/generated-id:

Boolean czy pole jest polem automatycznie wygenerowany identyfikator. Domyślna wartość to fałsz. Tylko jedno pole może mieć ten zestaw w klasie. Dzięki temu baza danych automatycznie wygeneruje odpowiedni identyfikator dla każdego wstawionego wiersza. Gdy obiekt o wygenerowanym identyfikatorze zostanie utworzony za pomocą metody Dao.create(), baza danych wygeneruje identyfikator dla wiersza, który zostanie zwrócony i ustawiony w obiekcie metodą create. Niektóre bazy danych wymagają sekwencji generowanych identyfikatorów, w którym to przypadku nazwa sekwencji będzie generowana automatycznie. Aby określić nazwę sekwencji, użyj generateIdSequence. Można podać tylko jedną wartość this, id i generatedIdSequence.

Musisz użyć albo generatedId (w tym przypadku wydaje się, wszystkie identyfikatory muszą być generowane) lub id (w tym przypadku można je ustawić), ale nie jednocześnie.

+0

Zrobiłem to, ale założyłem, że będę mógł również wprowadzić mój własny identyfikator, ponieważ w innych bazach danych mogę WSTAWIĆ z identyfikatorem, nawet jeśli ma wygenerowany automatycznie klucz podstawowy. Czy jest to coś charakterystycznego dla konfiguracji ORMLite, czy może baz danych SQLite? –

+0

Jest to specyficzne dla ORMLite: zobacz http://ormlite.svn.sourceforge.net/viewvc/ormlite/ormlite-core/trunk/src/main/java/com/j256/ormlite/stmt/mapped/MappedCreate.java? wersja = 1861 i widok = znaczniki, wiersz 32.Zauważysz, że automatycznie przypisuje on identyfikator dla ustawień generatedId lub generatedIdSequence, bez sprawdzania, czy wartość jest już ustawiona. Jeśli korzystasz z SQLite, możesz po prostu napisać do bazy danych ręcznie, następnie załadować ponownie z ORMLite lub dodać oddzielną kolumnę dla identyfikatora bazy danych serwera (co robię, nawet jeśli nie używam ORMLite). – Femi

Powiązane problemy