Good point about cropped versions of ringtones.

It seems to me that "fill in the gaps" is not the behavior the user would expect.  If you have 1, 2 and 3, and the user deletes 2 then creates a new cropped version, I'd guess they'd expect it to be number 4 and will be confused if deleted number 2 comes back!

I worry about the extra testing and maintenance burden of adding an index to the db. So I think if I were doing this I'd just enumerate all the entries before saving to uniquify.  Or punt it altogether.  Or use the song duration as to disambiguate.  That might actually be useful information for someone choosing a tone, wouldn't it?  And you probably get the duration after the canplay event, so you could add it to your "validated" event or something.