#swift #sqlite
#быстрый #sqlite
Вопрос:
Я работал над проектом, в котором есть две базы данных для отслеживания. Я получаю следующую ошибку при попытке открыть базу данных для вставки в таблицу:
API call with invalid database connection pointer Optional(0x00000001025a9ce2)
Это код для вставки(приведенная выше ошибка выводится с сообщением об ошибке sqlite3):
func insertRating(rating: Double,usrname: String,picture: String) { //Open up Users database let userDB = UserDatabase().createDB() print(rating,usrname,picture) let insertStatementString = "insert into Rating (Picture,Rating,UserID_fk) values('" picture "','" String(rating) "',(select UserID from Users where Username = '" usrname "'))" var insertStatement: OpaquePointer? if sqlite3_prepare_v2(userDB, insertStatementString, -1, amp;insertStatement, nil) == SQLITE_OK{ if sqlite3_step(insertStatement) == SQLITE_DONE { print("Inserted Row") } else{ print(sqlite3_errmsg(insertStatement)) print("Could not insert row") } } else { print("Insert statement not prepared") } sqlite3_finalize(insertStatement) sqlite3_close(userDB) }
Я убедился, что на протяжении всего кода я правильно открывал и закрывал базу данных. Никакая другая база данных не открыта во время просмотра содержимого, другая функция просто возвращает массив URL-адресов изображений, которые печатаются в строке.
Я использую следующую библиотеку StarRating, которая вызывает функцию, передающую различные параметры, которые я хочу вставить в таблицу.
List(pictureURL, id: .self) { pic in //For each photo in pictureURL //Associate with a rating clikced on by the user LazyVStack{ if #available(iOS 15.0, *) { AsyncImage(url: URL(string: pic.photo), scale: 10.0) } else { // Fallback on earlier versions } StarRating(initialRating: 0,onRatingChanged: { insertRating(rating: $0, usrname: model.usrName, picture: pic.photo) }) } }
Я не думаю, что проблема в звездной библиотеке. Существует ли процедура, о которой я не знаю в отношении интерфейса sqlite3, встроенного в swift?
Изменить: Вот код для createDB:
func createDB() -gt; OpaquePointer?{ var db : OpaquePointer? guard sqlite3_open(path, amp;db) == SQLITE_OK else { print("error opening database users DB") sqlite3_close(db) db = nil return nil } return db }
Комментарии:
1. Вы вызываете вставку в цикле, поэтому для каждого элемента, который вы открываете и закрываете базу данных, я понятия не имею, вызывает ли это проблему, но это выглядит немного неэффективно. Также можете ли вы опубликовать код в createDB?
2. @JoakimDanielson Я не уверен, как еще связать рейтинг с каждой картинкой, в любом случае, вставка вызывается только тогда, когда я нажимаю на звезду.
3. Я вижу, что createDB возвращает необязательное значение, но вы никогда не проверяете наличие нуля при вставке