Szukam sposobu na dostęp do bazy danych SQLite w mojej aplikacji za pomocą kodu Swift.
Wiem, że mogę użyć SQLite Wrapper w Objective C i użyć nagłówka pomostowego, ale wolałbym móc wykonać ten projekt całkowicie w języku Swift. Czy istnieje sposób, aby to zrobić, a jeśli tak, czy ktoś może wskazać mi odniesienie, które pokazuje, jak przesłać zapytanie, pobrać wiersze itp.?
let dbPath = try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("test.sqlite").path
.Odpowiedzi:
Chociaż prawdopodobnie powinieneś użyć jednego z wielu opakowań SQLite, jeśli chcesz wiedzieć, jak samodzielnie wywołać bibliotekę SQLite, powinieneś:
Skonfiguruj projekt Swift do obsługi wywołań SQLite C. Jeśli używasz Xcode 9 lub nowszego, możesz po prostu:
Utwórz / otwórz bazę danych.
Uwaga, wiem, że zamknięcie bazy danych po niepowodzeniu otwarcia wydaje się dziwne, ale
sqlite3_open
dokumentacja wyraźnie mówi, że musimy to zrobić, aby uniknąć wycieku pamięci:Służy
sqlite3_exec
do wykonywania SQL (np. Tworzenia tabeli).Służy
sqlite3_prepare_v2
do przygotowania kodu SQL z?
symbolem zastępczym, do którego przypiszemy wartość.Zauważ, że używa
SQLITE_TRANSIENT
stałej, którą można zaimplementować w następujący sposób:Zresetuj kod SQL, aby wstawić inną wartość. W tym przykładzie wstawię
NULL
wartość:Sfinalizuj przygotowaną instrukcję, aby odzyskać pamięć związaną z tą przygotowaną instrukcją:
Przygotuj nową instrukcję do wybierania wartości z tabeli i zapętlaj pobieranie wartości:
Zamknij bazę danych:
W przypadku Swift 2 i starszych wersji Xcode zobacz poprzednie wersje tej odpowiedzi .
źródło
guard
użyłbym zamiast tego instrukcji.Najlepsze, co możesz zrobić, to zaimportować bibliotekę dynamiczną do nagłówka mostkującego:
#import <sqlite3.h>
na górzeBędziesz wtedy mógł uzyskać dostęp do wszystkich metod c, takich jak
sqlite3_open
z kodu Swift.Jednak możesz po prostu chcieć użyć FMDB i zaimportować to przez nagłówek mostkujący, ponieważ jest to bardziej zorientowane obiektowo opakowanie sqlite. Obsługa wskaźników i struktur języka C będzie uciążliwa w języku Swift.
źródło
NSDateFormatter
. Ale moim zamiarem było nie tyle krytykowanie tego konkretnego aspektu tych konkretnych wdrożeń, ile zasugerowanie, że wskazuje to na szerszy problem, że nie mają one lat udoskonalenia, jakie mają rozwiązania takie jak FMDB. Myślę, że ludzie zbyt szybko odrzucają sprawdzone rozwiązania Objective-C na rzecz mniej dojrzałych implementacji Swift (kolejnym dobrym przykładem są TFHpple vs NDHpple).Ja również szukałem sposobu na interakcję z SQLite w taki sam sposób, jak robiłem to wcześniej w Objective-C. Trzeba przyznać, że ze względu na kompatybilność z C po prostu użyłem prostego API C.
Ponieważ obecnie nie istnieje opakowanie dla SQLite w Swift, a wspomniany powyżej kod SQLiteDB idzie nieco wyżej i zakłada określone użycie, zdecydowałem się stworzyć opakowanie i przy okazji trochę zaznajomić się ze Swift. Możesz go znaleźć tutaj: https://github.com/chrismimpson/SwiftSQLite .
źródło
Stworzyłem elegancką bibliotekę SQLite napisaną w całości w języku Swift o nazwie SwiftData .
Niektóre z jego funkcji to:
Zapewnia łatwy sposób wykonywania „zmian” (np. WSTAW, AKTUALIZUJ, USUŃ itp.):
i „zapytania” (np. SELECT):
Wraz z wieloma innymi funkcjami!
Możesz to sprawdzić tutaj
źródło
Kolejna otoka SQLite dla Swift 2 i Swift 3: http://github.com/groue/GRDB.swift
Cechy:
Interfejs API, który będzie wyglądał znajomo dla użytkowników ccgus / fmdb
Niskopoziomowy interfejs API SQLite, który wykorzystuje standardową bibliotekę Swift
Ładny interfejs zapytań Swift dla programistów uczulonych na język SQL
Obsługa trybu SQLite WAL i jednoczesny dostęp do bazy danych w celu zwiększenia wydajności
Klasa Record, która zawija zestawy wyników, zjada niestandardowe zapytania SQL na śniadanie i udostępnia podstawowe operacje CRUD
Swift swobodę typów: wybierz odpowiedni typ Swift, który pasuje do Twoich danych. W razie potrzeby użyj Int64 lub trzymaj się wygodnego Int. Przechowuj i czytaj NSDate lub NSDateComponents. Zadeklaruj wyliczenia Swift dla dyskretnych typów danych. Zdefiniuj własne typy konwersji baz danych.
Migracje baz danych
Prędkość: https://github.com/groue/GRDB.swift/wiki/Performance
źródło
AppDelegate.swift
Database.swift
Model.swift
Baza danych dostępu:
bazy danych Query fire:
źródło
To zdecydowanie najlepsza biblioteka SQLite, z której korzystałem w Swift: https://github.com/stephencelis/SQLite.swift
Spójrz na przykłady kodu. O wiele czystszy niż C API:
Dokumentacja mówi również, że „SQLite.swift działa również jako lekka, przyjazna dla języka Swift nakładka na C API” i podaje kilka przykładów tego.
źródło
Napisałem bibliotekę opakowującą SQLite3 napisaną w języku Swift .
W rzeczywistości jest to opakowanie bardzo wysokiego poziomu z bardzo prostym interfejsem API, ale w każdym razie ma kod międzyoperacyjny C niskiego poziomu i zamieszczam tutaj (uproszczoną) jego część, aby pokazać inter-operację C.
Jeśli potrzebujesz pełnego kodu źródłowego tego opakowania niskiego poziomu, zobacz te pliki.
źródło
Skonfiguruj projekt Swift do obsługi wywołań SQLite C:
i użył następującego kodu
źródło
Czasami wystarczy podejście „SQLite w 5 minut lub mniej” pokazane na sqlite.org w wersji Swift . W „5 min lub mniej,” zastosowanie podejścia
sqlite3_exec()
, które to owinięcie wygodasqlite3_prepare()
,sqlite3_step()
,sqlite3_column()
isqlite3_finalize()
.Swift 2.2 może bezpośrednio obsługiwać
sqlite3_exec()
callback
wskaźnik funkcji jako globalną procedurę niebędącą instancjąfunc
lub zamknięcie literału nieprzechwytywanego{}
.Czytelny
typealias
Podejście oddzwonienia
Podejście końcowe
Aby przygotować projekt Xcode do wywołania biblioteki C, takiej jak SQLite, należy (1) dodać nagłówki C odwołania do pliku Bridging-Header.h, takie jak
#import "sqlite3.h"
(2) dodać Bridging-Header.h do nagłówka Bridging-C Bridging w projekcie settings i (3) dodajlibsqlite3.tbd
do ustawień docelowych Link Binary With Library .Sqlite.org „s «SQLite w 5 minut lub mniej» przykład jest realizowany w ramach projektu Swift Xcode7 tutaj .
źródło
Możesz użyć tej biblioteki w Swift dla SQLite https://github.com/pmurphyjam/SQLiteDemo
SQLiteDemo
SQLite Demo przy użyciu Swift z klasą SQLDataAccess napisaną w języku Swift
Dodawanie do projektu
Potrzebujesz tylko trzech plików, aby dodać do swojego projektu * SQLDataAccess.swift * DataConstants.swift * Bridging-Header.h Bridging-Header musi być ustawiony w projekcie Xcode „Objective-C Bridging Header” w „Swift Compiler - General”
Przykłady użycia
Po prostu postępuj zgodnie z kodem w ViewController.swift, aby zobaczyć, jak napisać prosty SQL za pomocą SQLDataAccess.swift Najpierw musisz otworzyć bazę danych SQLite, z którą masz do czynienia
Jeśli openConnection się powiodło, możesz teraz zrobić proste wstawienie do Table AppInfo
Zobacz, jakie to proste!
Pierwszym terminem w db.executeStatement jest twój SQL jako String, wszystkie następujące terminy są listą argumentów o zmiennej liczbie argumentów typu Any i są parametrami w tablicy. Wszystkie te terminy są oddzielone przecinkami na liście argumentów SQL. Możesz wprowadzić ciągi, liczby całkowite, daty i obiekty blob bezpośrednio po instrukcji sequel, ponieważ wszystkie te terminy są uważane za parametry dla sequela. Zmienna tablica argumentów sprawia, że wygodnie jest wprowadzić cały sequel za pomocą jednego wywołania executeStatement lub getRecordsForQuery. Jeśli nie masz żadnych parametrów, nie wprowadzaj niczego po swoim SQL.
Tablica wyników jest tablicą słowników, gdzie „klucz” to nazwa kolumny tabeli, a „wartość” to dane uzyskane z SQLite. Możesz łatwo iterować tę tablicę za pomocą pętli for lub wydrukować ją bezpośrednio lub przypisać te elementy Dictionary do niestandardowych klas obiektów danych, których używasz w kontrolerach widoku do wykorzystania w modelu.
SQLDataAccess będzie przechowywać, text, double, float, blob, Date, integer i long long integer. W przypadku obiektów blob można przechowywać pliki binarne, varbinary, blob.
W przypadku tekstu możesz przechowywać char, character, clob, narodowy znak zmienny, znak natywny, nchar, nvarchar, varchar, wariant, zmienny znak, tekst.
W przypadku dat można przechowywać datę i godzinę, godzinę, znacznik czasu, datę.
W przypadku liczb całkowitych można przechowywać bigint, bit, bool, boolean, int2, int8, integer, mediumint, smallint, tinyint, int.
W przypadku podwójnych można przechowywać dziesiętne, podwójnej precyzji, zmiennoprzecinkowe, numeryczne, rzeczywiste, podwójne. Double ma największą precyzję.
Możesz nawet przechowywać wartości Null typu Null.
W ViewController.swift przedstawiono bardziej złożony przykład pokazujący, jak wstawić słownik jako „obiekt BLOB”. Ponadto SQLDataAccess rozumie natywną datę Swift (), dzięki czemu można wstawiać te obiekty bez konwersji, konwertuje je na tekst i zapisuje, a po odzyskaniu konwertuje je z powrotem z tekstu na datę.
Oczywiście prawdziwą mocą SQLite są możliwości Transakcji. Tutaj możesz dosłownie ustawić w kolejce do 400 instrukcji SQL z parametrami i wstawić je wszystkie naraz, co jest naprawdę potężne, ponieważ jest tak szybkie. ViewController.swift pokazuje również przykład, jak to zrobić. Wszystko, co naprawdę robisz, to tworzenie tablicy słowników o nazwie `` sqlAndParams '', w tej tablicy Twoje słowniki przechowujące z dwoma kluczami `` SQL '' dla instrukcji lub zapytania sequel String oraz `` PARAMS '', które jest po prostu tablicą obiektów natywnych SQLite rozumie dla tego zapytania. Każdy „sqlParams”, który jest indywidualnym Słownikiem dalszych zapytań wraz z parametrami, jest następnie przechowywany w tablicy „sqlAndParams”. Po utworzeniu tej tablicy po prostu wywołujesz.
Ponadto wszystkie metody executeStatement i getRecordsForQuery można wykonać za pomocą prostego ciągu znaków dla zapytania SQL i tablicy dla parametrów wymaganych przez zapytanie.
Istnieje również wersja Objective-C i nazywa się ją tym samym SQLDataAccess, więc teraz możesz napisać swoją kontynuację w Objective-C lub Swift. Ponadto SQLDataAccess będzie również działał z SQLCipher, obecny kod nie jest jeszcze skonfigurowany do pracy z nim, ale jest to dość łatwe, a przykład, jak to zrobić, znajduje się w wersji SQLDataAccess Objective-C.
SQLDataAccess jest bardzo szybką i wydajną klasą i może być używana zamiast CoreData, która tak naprawdę używa SQLite, ponieważ jest to podstawowy magazyn danych bez wszystkich błędów integralności danych CoreData, które pochodzą z CoreData.
źródło
Możesz z łatwością skonfigurować SQLite przy użyciu klasy pojedynczej tony.
Odnosić się
https://github.com/hasyapanchasara/SQLite_SingleManagerClass
Sposób tworzenia bazy danych
Metoda wstawiania, aktualizowania i usuwania danych
Metoda wyboru danych
źródło