1.) A possibility to avoid primary key crashes is to use auto increment fields.
If a column has the type INTEGER PRIMARY KEY AUTOINCREMENT then a
slightly different ROWID selection algorithm is used. The ROWID chosen
for the new row is at least one larger than the largest ROWID that has
ever before existed in that same table.
See sqlite documentation here.
If in your example id
would be an auto increment field you do not need to specify it in the insert.
2.) Yes it is possible(for one row) like the documentation you refer to says:
public long insert (String table, String nullColumnHack, ContentValues values)
values this map contains the initial column values for the row. The
keys should be the column names and the values the column values
However you should use prepared statements(reference here: How do I use prepared statements in SQlite in Android?)
If you want to insert all 3 rows with one shot you need to build the string or execute the inserts 3 times.
Edit to your comment:
3.) This is pretty well answered here: INSERT IF NOT EXISTS ELSE UPDATE?
See also here: http://sqlite.org/lang_conflict.html
REPLACE
When a UNIQUE constraint violation occurs, the REPLACE algorithm
deletes pre-existing rows that are causing the constraint violation
prior to inserting or updating the current row and the command
continues executing normally. If a NOT NULL constraint violation
occurs, the REPLACE conflict resolution replaces the NULL value with
he default value for that column, or if the column has no default
value, then the ABORT algorithm is used. If a CHECK constraint
violation occurs, the REPLACE conflict resolution algorithm always
works like ABORT.