Два столбца идентификатора в SQLite Android. Это разумно?
Я изучаю исходный код приложения Google io schedule в образовательных целях. И я заметил интересную вещь.
В ScheduleProvider
они используют два id
поле. Например, вы можете видеть, что в таблице блоков они используют хорошо известные BaseColumns._ID
и другой BlocksColumns.BLOCK_ID column
,
db.execSQL("CREATE TABLE " + Tables.BLOCKS + " ("
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ BlocksColumns.BLOCK_ID + " TEXT NOT NULL," // BlocksColumns.BLOCK_ID == "block_id"
+ BlocksColumns.BLOCK_TITLE + " TEXT NOT NULL,"
+ BlocksColumns.BLOCK_START + " INTEGER NOT NULL,"
+ BlocksColumns.BLOCK_END + " INTEGER NOT NULL,"
+ BlocksColumns.BLOCK_TYPE + " TEXT,"
+ BlocksColumns.BLOCK_SUBTITLE + " TEXT,"
+ "UNIQUE (" + BlocksColumns.BLOCK_ID + ") ON CONFLICT REPLACE)");
Итак, мой вопрос: зачем им два столбца для id
?
У меня есть одно предположение. Я думаю, что они не хотят отказываться от стандартных инструментов, таких как SimpleCursorAdapter
поэтому они создали столбец "_id". Но они также хотят сделать много joins
без конфликтов имен, поэтому они создали столбец "%table%_id" для каждой таблицы. Я прав? Если так, у меня есть другой вопрос. Как они генерируют уникальный "%table%_id" для каждой новой строки?
РЕДАКТИРОВАТЬ:
Я спрашиваю не только тех, кто исследовал этот код, но и опытных программистов Android, которые, вероятно, сталкивались с той же схемой.