Первичные ключи в комнате должны быть Int или Long? - PullRequest
0 голосов
/ 05 мая 2019

Я разрабатываю базу данных, которая будет реализована в Android с использованием Room, после прочтения документации я обнаружил, что нет никаких рекомендаций относительно использования Int или Long в качестве первичных ключей.

В некоторых местах они определяют сущности с первичными ключами int:

@Entity
data class User(
    @PrimaryKey var id: Int,
    var firstName: String?,
    var lastName: String?
)

Но в другом месте это говорит о том, что если вы хотите получить идентификатор последней вставленной строки, метод "insert" возвращаетlong.

@Dao
interface MyDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertUsers(vararg users: User)

    @Insert
    fun insertBothUsers(user1: User, user2: User)

    @Insert
    fun insertUsersAndFriends(user: User, friends: List<User>)
}

Если метод @Insert получает только 1 параметр, он может вернуть long, который является новым rowId для вставленного элемента.Если параметр является массивом или коллекцией, он должен возвращать long [] или List.

Итак, первичные ключи в комнате должны быть Int или Long ?;Есть ли лучшие практики по выбору одного типа над другим?

Ответы [ 2 ]

5 голосов
/ 05 мая 2019

Оба эти типа будут сопоставлены с INTEGER в базовой базе данных SQLite.

Например, с таким классом:

@Entity
data class Test(@PrimaryKey val i: Int, val l: Long)

Вы получите таблицу SQLite, определенную с помощью этого запроса:

CREATE TABLE IF NOT EXISTS `Test` (`i` INTEGER NOT NULL, `l` INTEGER NOT NULL, PRIMARY KEY(`i`))

Так что вы можете использовать тот, который вам понадобится в вашем коде. Если вы по какой-то причине решили использовать Int и у вас закончились значения, вы даже можете изменить его на Long, не перенося вашу базу данных позже.

Что касается этого типа INTEGER, согласно документации SQLite :

Значение представляет собой целое число со знаком, сохраняемое в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения.

1 голос
/ 05 мая 2019

Оба в порядке.На мобильном телефоне (и в большинстве случаев в целом) Int должно быть достаточно (это также сэкономит вам 4 байта сверх Long).

Почему? Использование IntВы можете хранить более 2 миллиардов записей (2_000_000_000).Таким образом, вы можете хранить записи о 1/4 всех людей, живущих на земле.Просто для сравнения: использование Long позволит вам хранить более 900 квадриллионов записей (900_000_000_000_000_000).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...