Как добавить список целых чисел в таблицу в sqlite3 - PullRequest
0 голосов
/ 11 февраля 2020

Я пишу базу данных, которая будет использоваться для игры. Так что в этой базе данных у меня есть таблица PLAYERS, которая содержит некоторую информацию об игроках в игре. Для одного из столбцов этой таблицы мне нужен список, который будет содержать целые числа (идентификаторы) игроков, которые дружат с текущим игроком. (как список друзей)
Проблема в том, что сначала размер этого списка не определен и изменится (при добавлении или удалении друга), а вторая проблема заключается в том, что sqlite3 позволяет использовать только основные значения, такие как INT, TEXT и др. c. Поэтому мой вопрос заключается в том, как я мог бы добавить такой столбец в мою таблицу и соответствующим образом изменить его (что означает добавление или удаление содержимого из него)?
Я знаю, выполняя поиск, я мог бы добавить вторую таблицу и использовать ее, не используя Я действительно знаю, как это сделать, и я был бы признателен, если бы кто-то мог помочь и направить меня, бросьте его.
Вот код:

  std::string sql = "CREATE TABLE IF NOT EXISTS PLAYERS("
                    "ID INTEGER PRIMARY KEY AUTOINCREMENT, "
                    "USERNAME               TEXT NOT NULL UNIQUE, " 
                    "PASSWORD               TEXT NOT NULL, "
                    "SCORE                  REAL NOT NULL  );"; 
  // here I want to add the column that I am talking about with name of FRIENDS which contains the ID (a list of integers) of the other players
  int ret = 0;
  char* errMsg;

  ret = sqlite3_exec(DB, sql.c_str(), nullptr, 0, &errMsg);
  if (ret != SQLITE_OK) {
    std::cerr << "Table creation error: " << sqlite3_errmsg(DB) << std::endl;
    sqlite3_free(errMsg);
    return false;
  } else {
    std::cout << "Table created successfully." << std::endl;
  }

  std::ostringstream osql;
  osql << "INSERT INTO PLAYERS (USERNAME, PASSWORD, SCORE) VALUES('" << "mra" << "', '" << "12456" << "', " << 20.2 << ");";
  std::string sql = osql.str();

  int ret = 0;
  char* errMsg;

  ret = sqlite3_exec(DB, sql.c_str(), nullptr, 0, &errMsg);
  if (ret != SQLITE_OK) {
    std::cerr << "Insertion error: " << sqlite3_errmsg(DB) << std::endl;
    sqlite3_free(errMsg);
    return false;
  } else {
    std::cout << "Insertion was successfull." << std::endl;
  }

Спасибо заранее за вашу помощь.

1 Ответ

1 голос
/ 12 февраля 2020

То, что вы описываете, это отношения «многие ко многим» между игроками. * Соединительная таблица лучше подходит для этой цели, чем столбец списка друзей.

Соединительная таблица может иметь такую ​​структуру:

| Player1 | Player2 |
| 1       | 2       |
| 1       | 3       |

С ПРОВЕРКОЙ ограничение, которое вы можете применить Player1

sql для создания такой таблицы (FRIENDS) будет:

CREATE TABLE "FRIENDS" (
    "PLAYER1"   INTEGER,
    "PLAYER2"   INTEGER,
    CHECK(PLAYER1<PLAYER2),
    FOREIGN KEY("PLAYER1") REFERENCES "PLAYERS"("ID") ON DELETE CASCADE,
    PRIMARY KEY("PLAYER1","PLAYER2"),
    FOREIGN KEY("PLAYER2") REFERENCES "PLAYERS"("ID") ON DELETE CASCADE
);

ON DELETE CASCADE гарантирует, что когда первичный ключ в связанных с таблицей PLAYERS строках в таблице FRIENDS также будет удален.

Так что вам просто нужно запросить таблицу FRIENDS, чтобы найти друзей игрока.

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