Honestly in the real world you would generally already know if the need expressed is meant to be a web service (for instance) and if it requires a database - and in those cases, most framework already propose an sqlite / fully-fleged database in the same code.
If we already know that a database might be required later then using something like sqlite straight is smart move that would allow you to write code that is instantly going to work when you actually need something fully fledged instead of re-writing it.
Knowing if you need a database or not is simply one of the first things you know, and writing code before setting that up is a waste of time or a learning process.
It is not whether you need a database or not. It is "how configurable/dynamic things should be". More configurability usually means more power to your users and more pain to maintain the software. So I usually go to the least amount of configurability and then add things when required.
The same goes for abstractions (you often need more of them when things becomes more configurable)
If we already know that a database might be required later then using something like sqlite straight is smart move that would allow you to write code that is instantly going to work when you actually need something fully fledged instead of re-writing it.
Knowing if you need a database or not is simply one of the first things you know, and writing code before setting that up is a waste of time or a learning process.