Вызов API с недопустимым указателем подключения к базе данных: Swift

#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 возвращает необязательное значение, но вы никогда не проверяете наличие нуля при вставке