Я ищу способ получить доступ к базе данных SQLite в моем приложении с помощью кода Swift.
Я знаю, что могу использовать SQLite Wrapper в Objective C и использовать заголовок моста, но я бы предпочел полностью реализовать этот проект на Swift. Есть ли способ сделать это, если да, может ли кто-нибудь указать мне ссылку, которая показывает, как отправить запрос, получить строки и т. Д.?
let dbPath = try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("test.sqlite").path
.Ответы:
Хотя вам, вероятно, следует использовать одну из многих оболочек SQLite, если вы хотите знать, как самостоятельно вызвать библиотеку SQLite, вы должны:
Настройте свой проект Swift для обработки вызовов SQLite C. Если вы используете Xcode 9 или новее, вы можете просто сделать:
Создать / открыть базу данных.
Обратите внимание, я знаю, что кажется странным закрывать базу данных при неудачном открытии, но в
sqlite3_open
документации четко указано, что мы должны это сделать, чтобы избежать утечки памяти:Используйте
sqlite3_exec
для выполнения SQL (например, создания таблицы).Используйте
sqlite3_prepare_v2
для подготовки SQL с?
заполнителем, к которому мы привяжем значение.Обратите внимание, что здесь используется
SQLITE_TRANSIENT
константа, которая может быть реализована следующим образом:Сбросьте SQL, чтобы вставить другое значение. В этом примере я вставлю
NULL
значение:Завершите подготовленный оператор, чтобы восстановить память, связанную с этим подготовленным оператором:
Подготовьте новый оператор для выбора значений из таблицы и выполните цикл для получения значений:
Закрыть базу данных:
Для Swift 2 и более старых версий Xcode см. Предыдущие версии этого ответа .
источник
guard
вместо этого инструкции.Лучшее, что вы можете сделать, это импортировать динамическую библиотеку внутри заголовка моста:
#import <sqlite3.h>
в началоПосле этого вы сможете получить доступ ко всем методам c, например,
sqlite3_open
из вашего быстрого кода.Однако вы можете просто использовать FMDB и импортировать его через заголовок моста, поскольку это более объектно-ориентированная оболочка sqlite. Работа с указателями и структурами C в Swift будет обременительной.
источник
NSDateFormatter
. Но я намеревался не столько критиковать этот конкретный аспект этих конкретных реализаций, сколько предположить, что это указывает на более широкую проблему, что у них нет лет доработок, которые есть у таких решений, как FMDB. Я думаю, что люди слишком быстро отказываются от проверенных решений Objective-C в пользу менее зрелых реализаций Swift (другой хороший пример - TFHpple против NDHpple).Я тоже искал способ взаимодействия с SQLite так же, как раньше в Objective-C. По общему признанию, из-за совместимости с C я просто использовал обычный API C.
Поскольку в настоящее время оболочки для SQLite в Swift не существует, а упомянутый выше код SQLiteDB имеет более высокий уровень и предполагает определенное использование, я решил создать оболочку и немного познакомиться со Swift в процессе. Вы можете найти его здесь: https://github.com/chrismsimpson/SwiftSQLite .
источник
Я создал элегантную библиотеку SQLite, полностью написанную на Swift, под названием SwiftData. .
Некоторые из его особенностей:
Он обеспечивает простой способ выполнения «изменений» (например, INSERT, UPDATE, DELETE и т. Д.):
и «запросы» (например, SELECT):
Наряду со многими другими функциями!
Вы можете проверить это здесь
источник
Еще одна оболочка SQLite для Swift 2 и Swift 3: http://github.com/groue/GRDB.swift
Особенности:
API, который будет знаком пользователям ccgus / fmdb
Низкоуровневый API SQLite, использующий стандартную библиотеку Swift.
Симпатичный интерфейс запросов Swift для разработчиков, страдающих аллергией на SQL
Поддержка режима SQLite WAL и одновременный доступ к базе данных для повышения производительности
Класс Record, который обертывает наборы результатов, обрабатывает ваши пользовательские запросы SQL на завтрак и предоставляет базовые операции CRUD.
Свобода типов Swift: выберите правильный тип Swift, соответствующий вашим данным. Используйте Int64 при необходимости или придерживайтесь удобного Int. Сохраните и прочтите NSDate или NSDateComponents. Объявите перечисления Swift для дискретных типов данных. Определите свои собственные типы, конвертируемые в базу данных.
Перенос базы данных
Скорость: https://github.com/groue/GRDB.swift/wiki/Performance
источник
AppDelegate.swift
Database.swift
Model.swift
База данных доступа:
огонь запроса базы данных:
источник
Это, безусловно, лучшая библиотека SQLite, которую я использовал в Swift: https://github.com/stephencelis/SQLite.swift
Посмотрите примеры кода. Намного чище, чем C API:
В документации также говорится, что «SQLite.swift также работает как легкая, дружественная к Swift оболочка над C API», и следует несколько примеров этого.
источник
Я написал библиотеку-оболочку SQLite3, написанную на Swift .
На самом деле это оболочка очень высокого уровня с очень простым API, но в любом случае у нее есть низкоуровневый межоперационный код C, и я публикую здесь (упрощенную) его часть, чтобы показать взаимодействие C.
Если вам нужен полный исходный код этой низкоуровневой оболочки, просмотрите эти файлы.
источник
Настройте свой проект Swift для обработки вызовов SQLite C:
и использовал следующий код
источник
Иногда бывает достаточно Swift-версии подхода «SQLite за 5 минут или меньше», показанной на sqlite.org . «5 минут или меньше» подход использования
sqlite3_exec()
которых является удобство обертка дляsqlite3_prepare()
,sqlite3_step()
,sqlite3_column()
, иsqlite3_finalize()
.Swift 2.2 может напрямую поддерживать
sqlite3_exec()
callback
указатель на функцию как глобальную, неэкземплярную процедуруfunc
или как закрытие литерала без фиксации{}
.Удобочитаемый
typealias
Обратный подход
Подход к закрытию
Чтобы подготовить проект Xcode для вызова библиотеки C, такой как SQLite, необходимо (1) добавить заголовки C ссылки на файл Bridging-Header.h, например
#import "sqlite3.h"
, (2) добавить Bridging-Header.h в заголовок моста Objective-C в проекте настройки и (3) добавитьlibsqlite3.tbd
в Link Binary With Library настройки целевые параметры.Sqlite.org «s „SQLite за 5 минут или меньше“ , например реализуется в рамках проекта Swift Xcode7 здесь .
источник
Вы можете использовать эту библиотеку в Swift для SQLite https://github.com/pmurphyjam/SQLiteDemo
SQLiteDemo
Демонстрация SQLite с использованием Swift с классом SQLDataAccess, написанным на Swift
Добавление в ваш проект
Вам нужно добавить только три файла в ваш проект * SQLDataAccess.swift * DataConstants.swift * Bridging-Header.h Bridging-Header должен быть установлен в вашем проекте Xcode «Objective-C Bridging Header» в разделе «Swift Compiler - General»
Примеры использования
Просто следуйте коду в ViewController.swift, чтобы увидеть, как писать простой SQL с помощью SQLDataAccess.swift. Сначала вам нужно открыть базу данных SQLite, с которой вы имеете дело.
Если openConnection удалось, теперь вы можете сделать простую вставку в Table AppInfo
Посмотрите, как это было просто!
Первый член в db.executeStatement - это ваш SQL как String, все последующие термины представляют собой список аргументов с переменным числом аргументов типа Any и являются вашими параметрами в массиве. Все эти термины разделены запятыми в вашем списке аргументов SQL. Вы можете ввести строки, целые числа, даты и большие двоичные объекты сразу после оператора продолжения, поскольку все эти термины считаются параметрами для продолжения. Массив вариативных аргументов просто упрощает ввод всего вашего продолжения в один вызов executeStatement или getRecordsForQuery. Если у вас нет параметров, не вводите ничего после вашего SQL.
Массив результатов - это массив словаря, где «ключ» - это имя столбца вашей таблицы, а «значение» - это ваши данные, полученные из SQLite. Вы можете легко выполнить итерацию по этому массиву с помощью цикла for, либо распечатать его напрямую, либо назначить эти элементы Dictionary для пользовательских классов объектов данных, которые вы используете в своих контроллерах представления для потребления модели.
SQLDataAccess будет хранить текстовые, двойные, float, blob, Date, целые и длинные длинные целые числа. Для BLOB-объектов вы можете хранить двоичные, varbinary, blob-файлы.
Для текста вы можете хранить char, character, clob, национальный переменный символ, собственный символ, nchar, nvarchar, varchar, вариант, изменяющийся символ, текст.
Для дат вы можете хранить дату и время, время, метку времени, дату.
Для целых чисел вы можете хранить bigint, bit, bool, boolean, int2, int8, integer, mediumint, smallint, tinyint, int.
Для чисел типа Double вы можете хранить десятичные числа, числа с двойной точностью, числа с плавающей запятой, числа, вещественные числа, числа с двойной точностью. Double имеет наибольшую точность.
Вы даже можете хранить значения Null типа Null.
В ViewController.swift сделан более сложный пример, показывающий, как вставить словарь как «Blob». Кроме того, SQLDataAccess понимает собственный Swift Date (), поэтому вы можете вставлять эти объекты без преобразования, он преобразует их в текст и сохраняет их, а при извлечении преобразует их обратно из текста в Date.
Конечно, настоящая сила SQLite - это возможность транзакций. Здесь вы можете буквально поставить в очередь 400 операторов SQL с параметрами и вставить их все сразу, что очень эффективно, так как это очень быстро. ViewController.swift также показывает вам пример того, как это сделать. Все, что вы на самом деле делаете, это создаете массив словарей под названием sqlAndParams, в этом массиве вы храните словари с двумя ключами «SQL» для оператора продолжения строки или запроса и «PARAMS», который представляет собой просто массив собственных объектов SQLite. понимает для этого запроса. Каждый «sqlParams», который представляет собой отдельный Словарь сиквела запроса плюс параметры, затем сохраняется в массиве «sqlAndParams». После создания этого массива вы просто вызываете.
Кроме того, все методы executeStatement и getRecordsForQuery могут быть выполнены с помощью простой строки для запроса SQL и массива для параметров, необходимых для запроса.
Версия Objective-C также существует и называется тем же SQLDataAccess, поэтому теперь вы можете написать свое продолжение на Objective-C или Swift. Кроме того, SQLDataAccess также будет работать с SQLCipher, текущий код еще не настроен для работы с ним, но это довольно легко сделать, и пример того, как это сделать, фактически находится в версии SQLDataAccess для Objective-C.
SQLDataAccess - это очень быстрый и эффективный класс, который можно использовать вместо CoreData, который на самом деле просто использует SQLite в качестве базового хранилища данных без всех сбоев целостности данных ядра CoreData, которые возникают с CoreData.
источник
Вы можете легко настроить SQLite с помощью swift, используя также однотонный класс.
Обратитесь
https://github.com/hasyapanchasara/SQLite_SingleManagerClass
Метод создания базы данных
Метод вставки, обновления и удаления данных
Метод выбора данных
источник