LocoKit icon indicating copy to clipboard operation
LocoKit copied to clipboard

Deleting TimelineItems

Open avinashamanjha251 opened this issue 3 years ago • 5 comments

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() }
    }

avinashamanjha251 avatar Oct 06 '21 10:10 avinashamanjha251

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()

sobri909 avatar Oct 07 '21 06:10 sobri909

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

Screenshot 2021-10-07 at 4 12 12 PM

file name - Jobs line number - 135 Screenshot 2021-10-07 at 4 12 34 PM

file name - TimelineSTore line number - 408 Screenshot 2021-10-07 at 4 12 45 PM

file name - TimelineSTore line number - 377 Screenshot 2021-10-07 at 4 07 15 PM

avinashamanjha251 avatar Oct 07 '21 10:10 avinashamanjha251

Does it crash immediately after starting recording? Does it also crash after a fresh launch of the app?

sobri909 avatar Oct 08 '21 07:10 sobri909

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.

sobri909 avatar Oct 08 '21 07:10 sobri909

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.

avinashamanjha251 avatar Oct 08 '21 18:10 avinashamanjha251