Saya mencari cara untuk mengakses database SQLite di aplikasi saya dengan kode Swift.
Saya tahu bahwa saya dapat menggunakan SQLite Wrapper di Objective C dan menggunakan header bridging, tetapi saya lebih suka dapat melakukan proyek ini sepenuhnya di Swift. Apakah ada cara untuk melakukan ini, jika demikian, dapatkah seseorang mengarahkan saya ke referensi yang menunjukkan cara mengirimkan kueri, mengambil baris, dll?
let dbPath = try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("test.sqlite").path
.Jawaban:
Meskipun Anda mungkin harus menggunakan salah satu dari banyak pembungkus SQLite, jika Anda ingin mengetahui cara memanggil pustaka SQLite sendiri, Anda akan:
Konfigurasikan proyek Swift Anda untuk menangani panggilan SQLite C. Jika menggunakan Xcode 9 atau lebih baru, Anda cukup melakukan:
Buat / buka database.
Catatan, saya tahu tampaknya aneh untuk menutup database saat gagal membuka, tetapi
sqlite3_open
dokumentasinya menjelaskan bahwa kita harus melakukannya untuk menghindari kebocoran memori:Digunakan
sqlite3_exec
untuk menjalankan SQL (misalnya membuat tabel).Gunakan
sqlite3_prepare_v2
untuk mempersiapkan SQL dengan?
placeholder yang akan kami ikat nilainya.Catatan, itu menggunakan
SQLITE_TRANSIENT
konstanta yang dapat diimplementasikan sebagai berikut:Setel ulang SQL untuk memasukkan nilai lain. Dalam contoh ini, saya akan memasukkan
NULL
nilai:Selesaikan pernyataan yang disiapkan untuk memulihkan memori yang terkait dengan pernyataan yang disiapkan itu:
Siapkan pernyataan baru untuk memilih nilai dari tabel dan perulangan melalui pengambilan nilai:
Tutup database:
Untuk Swift 2 dan versi Xcode yang lebih lama, lihat revisi sebelumnya dari jawaban ini .
sumber
guard
pernyataan sebagai gantinya.Hal terbaik yang dapat Anda lakukan adalah mengimpor pustaka dinamis di dalam header penghubung:
#import <sqlite3.h>
ke atasAnda kemudian akan dapat mengakses semua metode c seperti
sqlite3_open
dari kode swift Anda.Namun, Anda mungkin hanya ingin menggunakan FMDB dan mengimpornya melalui header bridging karena itu adalah pembungkus sqlite yang lebih berorientasi objek. Berurusan dengan pointer C dan struct akan menjadi rumit di Swift.
sumber
NSDateFormatter
. Tetapi niat saya bukan untuk mengkritik aspek khusus ini dari implementasi khusus ini daripada menyarankan bahwa ini menunjukkan masalah yang lebih luas, bahwa ini tidak memiliki tahun penyempurnaan yang dimiliki solusi seperti FMDB. Saya pikir orang terlalu cepat untuk membuang solusi Objective-C yang sudah terbukti demi penerapan Swift yang kurang matang (TFHpple vs NDHpple adalah contoh bagus lainnya).Saya juga sedang mencari cara untuk berinteraksi dengan SQLite dengan cara yang sama seperti yang biasa saya lakukan sebelumnya di Objective-C. Memang, karena kompatibilitas C, saya baru saja menggunakan C API langsung.
Karena saat ini tidak ada pembungkus untuk SQLite di Swift dan kode SQLiteDB yang disebutkan di atas berjalan sedikit lebih tinggi dan mengasumsikan penggunaan tertentu, saya memutuskan untuk membuat pembungkus dan sedikit terbiasa dengan Swift dalam prosesnya. Anda dapat menemukannya di sini: https://github.com/chrismsimpson/SwiftSQLite .
sumber
Saya telah membuat pustaka SQLite elegan yang ditulis sepenuhnya dalam Swift yang disebut SwiftData .
Beberapa fiturnya adalah:
Ini menyediakan cara mudah untuk menjalankan 'perubahan' (mis. INSERT, UPDATE, DELETE, dll.):
dan 'query' (misalnya PILIH):
Seiring dengan lebih banyak fitur!
Anda bisa memeriksanya di sini
sumber
Pembungkus SQLite lain untuk Swift 2 dan Swift 3: http://github.com/groue/GRDB.swift
Fitur:
API yang akan terlihat familier bagi pengguna ccgus / fmdb
API SQLite tingkat rendah yang memanfaatkan pustaka standar Swift
Antarmuka kueri Swift yang cantik untuk pengembang yang alergi terhadap SQL
Dukungan untuk mode SQLite WAL, dan akses database bersamaan untuk kinerja ekstra
Kelas Record yang membungkus kumpulan hasil, memakan kueri SQL kustom Anda untuk sarapan, dan menyediakan operasi CRUD dasar
Kebebasan tipe Swift: pilih tipe Swift yang tepat yang sesuai dengan data Anda. Gunakan Int64 bila perlu, atau tetap gunakan Int. Simpan dan baca NSDate atau NSDateComponents. Deklarasikan enum Swift untuk tipe data diskrit. Tentukan tipe konvertibel database Anda sendiri.
Migrasi Database
Kecepatan: https://github.com/groue/GRDB.swift/wiki/Performance
sumber
AppDelegate.swift
Database.swift
Model.swift
Access database:
database Query fire:
sumber
Sejauh ini, ini adalah pustaka SQLite terbaik yang pernah saya gunakan di Swift: https://github.com/stephencelis/SQLite.swift
Lihat contoh kode. Jauh lebih bersih dari C API:
Dokumentasi juga mengatakan bahwa "SQLite.swift juga berfungsi sebagai pembungkus ringan dan ramah Swift melalui C API," dan diikuti dengan beberapa contohnya.
sumber
Saya telah menulis pustaka pembungkus SQLite3 yang ditulis dalam Swift .
Ini sebenarnya adalah pembungkus tingkat sangat tinggi dengan API yang sangat sederhana, tetapi bagaimanapun, ia memiliki kode antar-operasi C tingkat rendah, dan saya memposting di sini bagian (yang disederhanakan) untuk menunjukkan antar-C.
Jika Anda menginginkan kode sumber lengkap dari pembungkus tingkat rendah ini, lihat file ini.
sumber
Konfigurasikan proyek Swift Anda untuk menangani panggilan SQLite C:
dan menggunakan kode berikut
sumber
Terkadang, versi Swift dari pendekatan "SQLite dalam 5 menit atau kurang" yang ditampilkan di sqlite.org sudah cukup. The "5 menit atau kurang" pendekatan kegunaan
sqlite3_exec()
yang merupakan pembungkus kemudahan bagisqlite3_prepare()
,sqlite3_step()
,sqlite3_column()
, dansqlite3_finalize()
.Swift 2.2 dapat secara langsung mendukung
sqlite3_exec()
callback
penunjuk fungsi baik sebagai prosedur non-instans globalfunc
atau penutupan literal non-capturing{}
.Dapat dibaca
typealias
Pendekatan Callback
Pendekatan Penutupan
Untuk mempersiapkan proyek Xcode untuk memanggil pustaka C seperti SQLite, seseorang perlu (1) menambahkan header C referensi file Bridging-Header.h seperti
#import "sqlite3.h"
, (2) menambahkan Bridging-Header.h ke Objective-C Bridging Header dalam proyek pengaturan, dan (3) tambahkanlibsqlite3.tbd
ke Link Binary With Library pengaturan target.The sqlite.org 's 'SQLite dalam 5 menit atau kurang' Misalnya diimplementasikan dalam proyek Swift Xcode7 sini .
sumber
Anda dapat menggunakan pustaka ini di Swift untuk SQLite https://github.com/pmurphyjam/SQLiteDemo
SQLiteDemo
Demo SQLite menggunakan Swift dengan kelas SQLDataAccess yang ditulis di Swift
Menambahkan ke Proyek Anda
Anda hanya perlu tiga file untuk ditambahkan ke proyek Anda * SQLDataAccess.swift * DataConstants.swift * Bridging-Header.h Bridging-Header harus disetel di proyek Xcode Anda 'Objective-C Bridging Header' di bawah 'Swift Compiler - General'
Contoh Penggunaan
Cukup ikuti kode di ViewController.swift untuk melihat cara menulis SQL sederhana dengan SQLDataAccess.swift Pertama, Anda perlu membuka Database SQLite yang berhubungan dengan Anda.
Jika openConnection berhasil, sekarang Anda dapat melakukan penyisipan sederhana ke Tabel AppInfo
Lihat betapa sederhananya itu!
Istilah pertama dalam db.executeStatement adalah SQL Anda sebagai String, semua istilah berikut adalah daftar argumen variadic tipe Any, dan merupakan parameter Anda dalam Array. Semua istilah ini dipisahkan dengan koma di daftar argumen SQL Anda. Anda dapat memasukkan Strings, Integers, Date's, dan Blob tepat setelah pernyataan sekuel karena semua istilah ini dianggap sebagai parameter untuk sekuelnya. Array argumen variadic membuatnya nyaman untuk memasukkan semua sekuel Anda hanya dalam satu panggilan executeStatement atau getRecordsForQuery. Jika Anda tidak memiliki parameter apa pun, jangan masukkan apa pun setelah SQL Anda.
Larik hasil adalah Array Kamus dengan 'kunci' adalah nama kolom tabel Anda, dan 'nilai' adalah data yang diperoleh dari SQLite. Anda dapat dengan mudah melakukan iterasi melalui larik ini dengan loop for atau mencetaknya secara langsung atau menetapkan elemen Dictionary ini ke objek data kustom Kelas yang Anda gunakan di View Controllers untuk konsumsi model.
SQLDataAccess akan menyimpan teks, double, float, blob, Date, integer dan long long integers. Untuk Blob Anda dapat menyimpan biner, varbinary, blob.
Untuk Teks Anda dapat menyimpan karakter, karakter, gumpalan, karakter bervariasi nasional, karakter asli, nchar, nvarchar, varchar, varian, karakter bervariasi, teks.
Untuk Tanggal Anda dapat menyimpan tanggal waktu, waktu, cap waktu, tanggal.
Untuk Integer Anda dapat menyimpan bigint, bit, bool, boolean, int2, int8, integer, mediumint, smallint, tinyint, int.
Untuk Ganda Anda dapat menyimpan desimal, presisi ganda, float, numeric, real, double. Ganda memiliki presisi paling tinggi.
Anda bahkan dapat menyimpan Null dari tipe Null.
Dalam ViewController.swift, contoh yang lebih kompleks telah diselesaikan dengan menunjukkan cara menyisipkan Kamus sebagai 'Blob'. Selain itu, SQLDataAccess memahami Swift Date () asli sehingga Anda dapat menyisipkan objek ini tanpa mengonversi, dan itu akan mengonversinya menjadi teks dan menyimpannya, dan ketika diambil, konversikan kembali dari teks ke Tanggal.
Tentu saja kekuatan sebenarnya dari SQLite adalah kemampuan Transaksinya. Di sini Anda benar-benar dapat mengantri 400 pernyataan SQL dengan parameter dan memasukkan semuanya sekaligus yang sangat kuat karena sangat cepat. ViewController.swift juga menunjukkan contoh bagaimana melakukan ini. Yang benar-benar Anda lakukan adalah membuat Array of Dictionaries yang disebut 'sqlAndParams', di Array ini Kamus penyimpanan Anda dengan dua kunci 'SQL' untuk pernyataan atau kueri sekuel String, dan 'PARAMS' yang hanya Array objek asli SQLite memahami kueri itu. Setiap 'sqlParams' yang merupakan Dictionary individual dari kueri sekuel plus parameter kemudian disimpan dalam Array 'sqlAndParams'. Setelah Anda membuat array ini, panggil saja.
Selain itu, semua metode executeStatement dan getRecordsForQuery dapat dilakukan dengan String sederhana untuk kueri SQL dan Array untuk parameter yang dibutuhkan oleh kueri.
Versi Objective-C juga ada dan disebut SQLDataAccess yang sama, jadi sekarang Anda dapat memilih untuk menulis sekuel Anda di Objective-C atau Swift. Selain itu SQLDataAccess juga akan bekerja dengan SQLCipher, kode saat ini belum disiapkan untuk bekerja dengannya, tetapi cukup mudah untuk dilakukan, dan contoh bagaimana melakukannya sebenarnya dalam versi Objective-C dari SQLDataAccess.
SQLDataAccess adalah kelas yang sangat cepat dan efisien, dan dapat digunakan sebagai pengganti CoreData yang benar-benar hanya menggunakan SQLite sebagai penyimpanan data yang mendasarinya tanpa semua gangguan integritas data inti CoreData yang datang dengan CoreData.
sumber
Anda dapat dengan mudah mengkonfigurasi SQLite dengan swift menggunakan kelas ton tunggal juga.
Lihat
https://github.com/hasyapanchasara/SQLite_SingleManagerClass
Metode untuk membuat database
Metode untuk memasukkan, memperbarui dan menghapus data
Metode untuk memilih data
sumber