Closed
Description
func migrateWordRank() async {
do {
let context = PersistenceController.shared.container.newBackgroundContext()
let dbHelper = WordDBHelper.shared
try context.performAndWait {
let request = WordEntity.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(keyPath: \WordEntity.timestamp, ascending: true)]
request.predicate = NSPredicate(format: "rank <= 0")
let words = try context.fetch(request)
for word in words {
if let rank = dbHelper.getRank(word: word.viewText, lang: word.lang) {
word.rank = Int64(rank)
}
}
try context.save()
}
} catch {
print("migrateWordRank error", error)
}
}
@MainActor
class WordDBHelper {
static let shared = WordDBHelper()
private var dbQueue: DatabaseQueue?
private init() {
let dbPath = Bundle.main.path(forResource: "words", ofType: "sqlite")!
dbQueue = try? DatabaseQueue(path: dbPath)
}
func getRank(word: String, lang: String?) -> Int? {
guard let dbQueue = dbQueue else { return nil }
let sql = "SELECT rank FROM words WHERE word = ? COLLATE NOCASE"
if let wordRank = try? dbQueue.read({ db in
try Int.fetchOne(db, sql: sql, arguments: [word])
}) {
return wordRank
}
let lemma = word.canLemmatized ? word.lemmatized(lang: lang) : word
if lemma != word, let lemmaRank = try? dbQueue.read({ db in
try Int.fetchOne(db, sql: sql, arguments: [lemma])
}) {
return lemmaRank
}
return nil
}
}

hi, I can't figure out why this crash here, the stack trace is not that helpful, would somebody help?