Aplikacja z SQLite i opcja undo

Aplikacja z SQLite i opcja undo
TL
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:37
0

Witam

Pytanie dotyczy aplikacji budowanej w oparciu o bazę danych sqlite.
W jaki sposób można rozwiązać kwestie cofania/przywracania wprowadzanych do bazy danych zmian tj opcja wstecz(cofnij)/dalej? Czy baza danych sqlite (ewentualnie inna darmowa) oferuje narzędzia które by to ułatwiały/realizowały? Jeżeli nie, to w jaki sposób takie zagadnienie rozwiązuje się w aplikacjach bazodanowych?

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
1

takich opcji nie oferuje chyba żadna baza danych "in box". W bazach transakcyjnych masz coś takiego jak transakcje i polega to na tym, że dopóki nie zatwierdzisz transakcji dane nie są zmieniane. Ale nie jest to "undo" w takim sensie jak np. w edytorze tekstu, gdzie możesz cofnąć np. ostatnie 50 zmian. Takie coś musisz już realizować sam - np. pamiętać każdą wersję rekordu.


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Żadna baza czegoś takiego nie wspiera. Albo ewentualnie w bardzo ograniczony sposób -> oracle ma flashback.
Są za to technologie które symulują takie mechanizmy -> http://www.jboss.org/envers poprzez zapisywanie informacji o wersjach w bazie.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
TL
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:37
0

Tak podejrzewałem, że nie będzie to proste. Jak więc jest to rozwiązywane w aplikacjach bazodanowych?
Najprostsze co mi przychodzi do głowy, to przechowywanie tylu wersji pliku bazy, ile kroków wstecz chcemy zachować - ale to raczej kiepski pomysl ze względu na szybkośc aplikacji (operowanie na wielu plikach) i objętość tych plików.

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

Trzymaj dane w pamieci zamiast co chwile mazac po bazie.

Zobacz pozostały 1 komentarz
abrakadaber
abrakadaber
@n0name_l po to ktoś wymyślił BD aby w przypadku awarii dane jednak były zapisane i aby do tych danych mogło się odwoływać wiele procesów jednocześnie. To twoje "trzymaj dane w pamięci" przeczy idei BD
n0name_l
Po to ktos wymyslil DB zeby trzymac tam duze ilosci danych, do ktorych niekoniecznie jest potrzebny szybki dostep. Natomiast nikt nie wymyslil DB z mysla robienia undo/redo na czyjes widzimisie. Powiedz o jakich awariach mowisz, bo nie wiem zbytnio, od ktorej strony zaczac to obalac. Drugi argument jest natomiast zwyczajnie smieszny.
abrakadaber
abrakadaber
zawieszenie kompa, brak prądu, cokolwiek?
n0name_l
Zawieszenie kompa, w sensie, ze system nie bedzie w stanie obsluzyc w odpowiednim czasie wszystkich zadan i kaze chwile poczekac? To nie, nic sie nie stanie z pamiecia. Brak pradu, wut? Caly czas mowimy o aplikacji klienckiej wykorzystujacej jakas sensowna technologie z sensownym cachem, czy przechodzimy do golych zapytan? Jesli to drugie, to tak masz racje. Jesli pierwsze tak czy siak bedzie utrata danych. Ogolem nie da sie zapobiec utracie danych w przypadku wszystkich awarii, co jest niejako oczywiste.
abrakadaber
abrakadaber
chłopie tu jest pytanie laika o sqlite i lazarusa! Jaki system? Mowa jest o exeku, który zapisuje coś do sqlita. Nawet notepad++ pozwala na undo po zapisie pliku. Jeśli to ma działać jakoś sensownie to żdne trzymanie w pamięci tylko zapisywanie kolejnych wersji lub zapisywanie kolejnych zmian tak aby się dało cofnąć do tyłu.
TL
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:37
0

pamiętać każdą wersję rekordu.

Tylko w jaki sposób? Na dzień dzisiejszy wygląda to mniej więcej w tak, że program pracuje na dwóch plikach bazy danych: tymczasowym oraz oryginalnym.
Wszelkie operacje program wykonuje na pliku tymczasowym, w przypadku zapisywania zmian (zapisz plik), plik tymczasowy staje sie plikiem głównym, oryginalny jest usuwany i na podstawie nowego głównego pliku tworzony jest nowy plik tymczasowy.
Wszelkie zmiany w bazie są wprowadzane na bieżąco do pliku tymczasowego.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
1

do tabeli bazy dodajesz dodatkowe pole - wersja rekordu i ono wraz z polem id tworzy dopiero unikalny identyfikator rekordu. Każdą nową wersję rekordu zapisujesz przez insert a nie update. Druga wersja to dodatkowa tabela, z takimi samymi polami jak tabela do której piszesz plus pole wersja. Trigger przy robieniu update lub delete na głównej tabeli wstawia jej aktualną kopię do tej tabeli


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.