ЭБР. Можно ли создать несколько таблиц с помощью db.create()?

Добрый день! Кажется, у меня возникли проблемы с созданием нескольких таблиц с помощью EDB. Я использую Arduino UNO и модуль SD-карты для сохранения моей базы данных.

Вот мой серийный номер.

Вот мой серийный номер
Вот мое объявление таблицы.

struct LogEvent {
  int id;
  String fname;
  float temperature;
}
logEvent;

struct SecondEvent {
  int id;
  String lastname;
}
secondEvent;  

Вот мой код db.create().

db.create(0, TABLE_SIZE, (unsigned int)sizeof(logEvent));
db.create(0, TABLE_SIZE, (unsigned int)sizeof(secondEvent));

Теперь, когда я пытаюсь восстановить, это удар. Вот мой код сохранения и извлечения.

void createRecords(int num_recs, float correctTemperature)
{
    Serial.print("Creating Records... ");
    for (int recno = 1; recno <= num_recs; recno++)
    {
      correctId++;
      logEvent.id = correctId;
      logEvent.fname = "Brix Nicholson";
      logEvent.temperature = correctTemperature;
      secondEvent.id = correctId;    
      EDB_Status result = db.appendRec(EDB_REC logEvent);
      if (result != EDB_OK) printError(result);   
    }
  Serial.println("DONE");
}

void createRecordSecondEvent()
 {
   correctId++;
   secondEvent.id = correctId;
   secondEvent.lastname = "Secretaria";
   EDB_Status result = db.appendRec(EDB_REC secondEvent);
   if (result != EDB_OK) printError(result);
 }  

void selectLastRecord()
{
  int lastRecNum = db.count();
  EDB_Status result = db.readRec(lastRecNum, EDB_REC logEvent);
  if(result == EDB_OK)
   {
     Serial.print(" ID: ");
     Serial.print(logEvent.id);
     Serial.print(" Name: ");
     Serial.print(logEvent.fname);
     Serial.print(" Temp: ");
     Serial.println(logEvent.temperature);
   }
   else printError(result);
}

void selectLastSecondRecord()
{
 int lastRecNum = db.count();
 EDB_Status result = db.readRec(lastRecNum, EDB_REC secondEvent);
 if(result == EDB_OK)
  {
   Serial.print("Second Event ID: ");
   Serial.print(secondEvent.id);
   Serial.print("Last Name: ");
   Serial.print(secondEvent.lastname);
  }
  else printError(result);
}

, 👍-1

Обсуждение

Я пропустил адрес, теперь все в порядке. Спасибо!, @Xirb


2 ответа


1

Кажется, я нашел ответ на свою проблему. Я забыл увеличить адрес EDB_header.

Я написал:

db.create(0, TABLE_SIZE, (unsigned int)sizeof(logEvent));
db.create(0, TABLE_SIZE, (unsigned int)sizeof(secondEvent));

Вместо:

db.create(0, TABLE_SIZE, (unsigned int)sizeof(logEvent));
db.create(1, TABLE_SIZE, (unsigned int)sizeof(secondEvent));
,

1

Кажется, я нашел ответ на свою проблему. забыл увеличить адрес EDB_header.

вы правы насчет увеличения адреса EDB_header. Но адрес — это позиция, с которой библиотека начинает чтение/запись.

если вы посмотрите на https://github.com/jwhiddon/EDB/blob/master/EDB.cpp#L66 и https://github.com/jwhiddon/EDB/blob/master/EDB.cpp#L34

библиотека записывает фиксированный размер заголовка в двоичном формате который включает

  1. магический байт для распознавания заголовка EDB
  2. количество записей, присутствующих в данный момент в таблице, равное 0 на данный момент
  3. размер одной записи
  4. размер таблицы (максимальный объем памяти, который разрешено использовать таблице)

и написать новую запись https://github.com/jwhiddon/EDB/blob/master/EDB.cpp#L93

так в

db.create(0, TABLE_SIZE, (unsigned int)sizeof(logEvent));
db.create(1, TABLE_SIZE, (unsigned int)sizeof(secondEvent));

второй оператор переопределит старый заголовок, за исключением первого байта (0-я позиция)

решение вашей проблемы будет

unsigned int FIRST_TABLE_HEADER_POSITION = 0;
db.create(FIRST_TABLE_HEADER_POSITION, FIRST_TABLE_SIZE, (unsigned int)sizeof(logEvent));

unsigned int SECOND_TABLE_HEADER_POSITION = FIRST_TABLE_HEADER_POSITION + (unsigned int)sizeof(EDB_Header) + FIRST_TABLE_SIZE;

db.create(SECOND_TABLE_HEADER_POSITION, SECOND_TABLE_SIZE, (unsigned int)sizeof(secondEvent));

теперь вы можете использовать

EDB_Status result = db.open(FIRST_TABLE_HEADER_POSITION );

и

db.close();
EDB_Status result = db.open(SECOND_TABLE_HEADER_POSITION );
,