Czy w sqlite3 i w javie można tworzyć i korzystać z dynamicznie utworzonej kolumny?

0

Dzień dobry. Żeby być precyzyjnym, dopiero początki sqlite3 za mną i się zastanawiam czy są możliwe takie operacje jak dynamiczne tworzenie tabel, korzystanie z nich jeśli są to zrób to czy tamto, tworzenie/ dodawanie w trakcie działania programu kolumny.. A najważniejsze: czy jest możliwe w funkcji programu sprawdzenie czy dana kolumna istnieje, a jeśli istnieje to np. pobierz z niej wartości. W wyszukiwarkę wrzuciłem ale wyskakują same podstawowe kursy albo takie opisy, ze ja z nich coś nie od razu zrozumiem. Możliwe że nie właściwe hasła. Czego szukać? Pozdrawiam i udanej niedzieli.

Chodzi mi np. o taki przypadek z sufitu do ćwiczeń, mam listę słów w kolumnie tłumaczenie polski i w drugiej angielskie. W trakcie działania programu chciałbym dodać np. kolumnę tłumaczenie j. francuski.

Edit. Do użytku na komputerze i urządzeniu mobilnym.

2

Sql na to pozwala ale na takim przykladzie z tyłka to trudno oceniać czego naprawdę potrzebujesz.

0

Myślę, że taki przykład ze słownikiem będzie najbardziej reprezentatywny. Powiedzmy, mam listę kodów oznaczeń języków
czyli tb_lang_complete:
id,
skrot,
nazwa_en,
nazwa_pl.
I tu mam ścągniętą z internetu kompletną listę a polskimi i angielskimi nazwami.

Mam "zaprojektowaną" tabelę bliźniaczą
tb_lang_other
id
id_tb_lang_complete - id kolumny której pozycję chcemy przetłumaczyć,
i na tym koniec

nazwa_fr - dynamicznie chciałbym dodać i sprawdzić obecność
nazwa_de - następna w kolejce, i inne tego typu

Na razie chcę to ogarnąć wizualnie dlatego nie podaje kodu żebym się nie pogubił.
Ale powiedzmy, że w tb_lang_other kolejne kolumny były by tworzone w miarę potrzeby nazwa_fr, nazwa_de.. itd.
A zapewne inna tabelka zawierała by listę samych nazw kolumn i np, procent wypełnienia tłumaczeniami. Chociaż gdzieś mi mignęło, że można listę nazw kolumn pobrać.
Ale tego jeszcze nie używałem, zapewne się też przyda.

I teraz gdy chciałbym w programie wyświetlić listę z tłumaczeniem to wybierałbym np. polski plus jakiś inny, czyli albo angielski (z tej samej tabeli) albo francuski.
Możliwość wyboru francuskiego czy niemieckiego pojawiła by się wtedy gdy była by taka kolumna ułożona.

Na tym etapie nie ważne czy z kilkuset nazw były by przetłumaczone tylko dwie. Chodzi o mechanizm obsługi takich kolumn. Bo gdyby się nie dało to robię na sztywno tablicę ze stoma kolumnami dla każdego języka osobno. Ale jeśli się da to trochę zmienia się podejście..

1

O ile dobrze rozumiem potrzeby, moim zdaniem problem rozwiąże coś, co nazywa się "widok" (view), czyli coś, co działa tak samo, jak tabela (można zrobić select z warunkami, grupowaniem, sortowaniem itd.), ale jest dynamicznie budowana na podstawie bardziej skomplikowanego zapytania.

Jeżeli widok byłby rozwiązaniem problemy, to wtedy można pytać, czy jest możliwość zrobienia widoku w SQLite i Java.

0

Z ogólnego opisu wynika, że widok w większości baz umożliwia tylko dostęp i operacje na istniejących danych. Więc jeśli tak jest w przypadku java + sqlite to się nie przyda. Po tu trzeba dodać nowe dane. Gdyby chodziło o utworzenie kolumny z danymi w kilku kolumn, lub przetworzenie np. matematyczne to w tedy tak. Ale doszukam.

PS. Edit. Do użytku na komputerze i urządzeniu mobilnym.

2

Ogolnie robienie nazwa_de i nazwa_pl itp to antywzorzec w sqlu robisz osobna tableka z nazwa i kodem języka i wzależności co chcesz to wybierasz.

3

Czysto hipotetycznie się da. Praktycznie oznacza to, że korzystasz z zapytań SQL przez JDBC. Mamy sobie jakieś połączenie do bazy i wiemy, że nasza tabela nazywa się tb_lang_other i chcemy dostać listę kolumn, których nazwa pasuje do wzorca nazwa_ZZZZ możemy zatem zrobić:

var databaseMetaData = connection.getMetaData();

var columnMetaData = databaseMetaData.getColumns(null, null, "tb_lang_other", "nazwa_%");

while(columnMetaData.next){
    String columnName = columns.getString("COLUMN_NAME");
//...
}

W columnMetaData mamy metadane wszystkich kolumn z tabeli tb_lang_other, których nazwa pasuje do wzorca. Można je zrzucić do listy i potem budować zapytania SQL bazując na tej liście.

1

Zamiast rozkminiac wyimaginowane problemy opisz jaki efekt chciałbyś uzyskac.

Mając młotek często wszystko wygląda jak gwóźdź mimo, że nim nie jest i mam trochę wrażenie, że tak jest w tym przypadku.

Pierwsza myśl z brzegu: skoro potrzebujesz mieć dynamiczna scheme to może wcale nie potrzebujesz relacyjnej bazy danych a jakąś NoSQL typu mongo dB itp.

0
Integers napisał(a):

Z ogólnego opisu wynika, że widok w większości baz umożliwia tylko dostęp i operacje na istniejących danych. Więc jeśli tak jest w przypadku java + sqlite to się nie przyda. Po tu trzeba dodać nowe dane. Gdyby chodziło o utworzenie kolumny z danymi w kilku kolumn, lub przetworzenie np. matematyczne to w tedy tak. Ale doszukam.

PS. Edit. Do użytku na komputerze i urządzeniu mobilnym.

Może być widok z pustych tabel, które nie zawierają żadnych danych, taki widok również będzie pusty. W niektórych przypadkach jest możliwe wywoływanie INSERT, UPDATE i DELETE na widoku. Z drugiej strony, jeżeli jest potrzeba dodawania nowych pozycji do widoku, to równie dobrze można robić dodanie pozycji w tabeli źródłowej, to tylko kwestia ułożenia i wypuszczenia odpowiedniego zapytania SQL.

Co do tabeli widokowej, to i nawet widoku nie trzeba tworzyć, wystarczy ułożyć i wywoływać odpowiedni SELECT, w końcu widok ma pod spodem zapytanie SELECT, więc na jedno wyjdzie, czy zrobi się widok w bazie danych, czy będzie się wywoływać odpowiednio przygotowany SQL, odpowiedź z bazy danych w obu przypadkach będzie taka sama.

3

Można to zrobić bez najmniejszego problemu, w oderwaniu od języka programowania, w samym SQL:

Dodanie kolumny do tabeli:

ALTER TABLE tb_lang_complete ADD nazwa_fr text

Sprawdzenie jakie kolumny masz w tabeli zaczynające się na nazwa:

SELECT * FROM PRAGMA_TABLE_INFO('tb_lang_complete') where name like 'nazwa%'
0

@Koziołek Dzięki. To jak się da to idę w tym kierunku, się dokształcę.

@RequiredNickname Przypadek jaki opisałem jest praktycznie identyczny z zamierzonym, bo o ile powiedzmy na takim mini słowniku się uczę to chciałbym właśnie mieć możliwość dodawania i korzystania z kolumny, która zawiera nowy parametr, nie przewidziane wcześniej danę czy jak to nazwać. Więc przykład z tłumaczeniem w nowym języku nie zapisanym wcześniej jest w sam raz.

@andrzejlisek samym widokiem się zainteresuje, zobaczę czy w ogóle się da.

@Panczo Ponieważ kiedyś tam był SQL ale to było dawno i podstawy a doczytałem,:

"Android SQLite to bardzo lekka baza danych, która jest dostarczana z systemem operacyjnym Android. Android SQLite łączy w sobie czysty interfejs SQL z bardzo małą ilością pamięci i przyzwoitą szybkością. W przypadku Androida SQLite jest „zapiekany” w środowisku uruchomieniowym Androida, więc każda aplikacja na Androida może tworzyć własne bazy danych SQLite.

Źródło: https://fikiri.net/co-to-jest-baza-danych-sqlite-w-systemie-android/

Chciałem się nauczyć sqlite3 bo ponoć sqlite działa bez dodatkowych manipulacji na androidzie, to i obsłużę sobie to na laptopie. I będę przerzucał na androida. dlatego na początku drogi zależy mi na ustaleniu co się da zrobić. Czy idę w dobrym kierunku.
A że teraz jestem na etapie budowania tabelek i relacji i na początku sqlite więc to chyba ostatni gwizdek na rozeznanie się temacie.

1

Jak dla mnie to próbujesz osiągnąć coś na siłę zamiast się zastanowić i przemyśleć jak to powinno być zrobione.
Zastanowienie się jak podejść do problemu zamiast rzucać się do pisania jakichś potworków wbrew zdrowemu rozsądkowi to imho bardzo dobry good practice.

Skoro potrzebujesz mieć coś dynamicznego to imho lepszym sposobem byłoby np. stworzenie kolumny zawierającej string/json i pakowanie tam jsona albo tak jak wspomniałem skorzystanie z innego typu bazy danych.

0

Dlatego najpierw pytam co się da a potem będę sprawdzał. W miarę czasu spróbuję wszystkiego. Od czegoś muszę zacząć.
Dziękuję Wszystkim za sugestie i podpowiedzi.

2

@Integers: możliwe jest wszystko co opisuje dokumentacja https://www.sqlite.org/docs.html,
zacznij od Create table oraz insert into
osiągnij poziom gdy potrafisz narysować model danych i zadaj pytanie w kontekście Twojego proponowanego modelu bedzie łatwiej zrozumieć co potrzebujesz i ewentualnie wyrazić konstruktywna krytykę.

Przemyslenie modelu danych może umożliwiło by zrezygnowanie z kolumn per jezyk , ale nie chce aż tak krytykować rozwiązania skoro nie mam kompletu danych a na dodatek raz w życiu zrobiłem podobnie :D

1

Rozumiem :) Dzięki

edit: Celowo nie pytam o gotowce czy konkretne przykłady bo ja z czasem do tego dotrę. Tylko chciałem wiedzieć czy się da i ewentualnie w którym kierunku... początki :)

1
  1. SqlLite nie jest optymalną bazą do Javy *), jest natywną, wymaga DLL itd, natywny DLL wcale nie jest tak szybki w Javie jak by można myśleć
    Java ma przynajmniej 3 bardzo fajne bazy natywne dla siebie (Derby - od kilku wersji dystrybuowana (była?) z JVM), H2, HSQL DB
    Każda z nich moze być wbudowana (in JVM) np na start jak i niezależnym serwerem na sockecie (po rozwinięciu sie projektu)

  2. zgadzam sie z tymi kolegami, którzy twierdzą, że temat jest źle postawiony. Dodawanie kolumn w locie I TAK wymusza jakieś meta-informacje, źle sprzęga się z językiem kompilowanym.
    Pomysł rozdymania tabeli jest bardzo Excellowy (tak, widziałem firmowych miszczów Excella, którzy się "unowocześnili" i poszli na bazy danych - dalej myśląc excellem a nie relacjami).

*) dialekt SQL który realizuje SqlLite jest specyficzny i anty-dydaktyczny, w rzeczywistości kolumny pozbawione typu i kilka innych dość ważnych zarzutów
Przeciwstawiając - wskazane javowskie bazy prezentują bardzo mainstreamowy SQL

1 użytkowników online, w tym zalogowanych: 0, gości: 1