How SQLite index ID (or line number) SQLite is based on a flatfile, and store virtual tables in a flatfile (I think based on offset, correct me if I'm wrong). But how it index the Primary Key (ID), which I think is identical to line number.

When having SELECT with WHERE clause that ID = 99,001, how it skips 99,000 rows to read only the requested row. How is the process in a flat file?
you're wrong.

There's nothing 'flat' in the SQLite database file; the file is internally split as pages, with trees and references between them.  A table doesn't' store records sequentially.

Check the file format docs