LocoKit
LocoKit copied to clipboard
Deleting TimelineItems
Hi @sobri909, Please help me on deleting TimelineItems from db. I'm trying with tappedClear() function to delete items. but I'm not able to track that how many items are already delete from db, because immediate boolean in save() function is false.
var dataSet: TimelineSegment?
var itemsToShow: [TimelineItem] {
return dataSet?.timelineItems ?? []
}
func tappedClear() {
// TODO: flush the timeline data
self.itemsToShow.forEach {
$0.delete()
}
store.keepDeletedObjectsFor = TimeInterval(timerCount)
store.hardDeleteSoftDeletedObjects()
}
public func save(_ object: TimelineObject, immediate: Bool) {
mutex.sync {
if let item = object as? TimelineItem {
itemsToSave.insert(item)
} else if let sample = object as? PersistentSample {
samplesToSave.insert(sample)
}
}
if immediate { save() }
}
For how many items are deleted, I'd just go with the itemsToShow.count
.
For hard deleting them, you will want to call store.save()
to ensure the soft deletes are pushed to the db before doing the hard delete. So for example:
self.itemsToShow.forEach {
$0.delete()
}
store.save() // this line will ensure the soft deletes have been pushed to the db before doing the hard delete
store.keepDeletedObjectsFor = TimeInterval(timerCount)
store.hardDeleteSoftDeletedObjects()
However, keep an eye on the console logs, because TimelineItems can't be deleted if they have any samples assigned. ie this check in the delete() method:
guard samples.isEmpty else {
os_log(.debug, "Can't delete an item that has samples. Assign the samples to another item first.")
return
}
If you're really wanting to delete all that recorded data entirely, then you should probably do something like this:
itemsToShow.forEach { item in
item.samples.forEach { $0.delete() }
item.delete()
}
store.save()
Hi @sobri909 .. after deleting all objects .. and again when starts the the recorder's startRecoding(), app crashes with fatal error
LocoKit/TimelineStore.swift:377: Fatal error: 'try!' expression unexpectedly raised an error: SQLite error 19 with statement COMMIT TRANSACTION
: FOREIGN KEY constraint failed
file name - Jobs line number - 44
file name - Jobs
line number - 135
file name - TimelineSTore
line number - 408
file name - TimelineSTore
line number - 377
Does it crash immediately after starting recording? Does it also crash after a fresh launch of the app?
Basically we'll need to figure out which constraint is failing. I presume it has to be sample.timelineItemId
, but I can't see how that would fail, given that a sample can only be assigned to an existing TimelineItem.
Does it crash immediately after starting recording? Does it also crash after a fresh launch of the app?
Not for first time.. crashes when started recording second time when I started recording second time it crash. App is opening successfully without any crash.