SQLite.Net, эквивалент С# для битового типа данных SQLite

Я объявляю следующий класс в С#

[Table("Employee")]
public class Employee
{
    [PrimaryKey,AutoIncrement]
    public int EmployeeId { get; set; } 
    public DateTime DateOfJoining { get; set; }
    public string Address{ get; set; }
}

и я вызываю этот метод для создания эквивалентной таблицы в моей базе данных SQLite

public async Task CreateTable()
{
   SQLiteAsyncConnection conn = new SQLiteAsyncConnection(path);
   await conn.CreateTableAsync<Employee>();
}

Итак, он создает таблицу в SQLite следующим образом.

[EmployeeId] int,
[DateOfJoining] [datetime],
[CallType] [varchar]

Я хотел создать столбец, который немного

[IsActive] [bit]

Для этого я пытался

public bool IsActive { get; set; } 

и

public Boolean IsActive { get; set; }

Оба этих свойства приводят к столбцу, который является целым числом.

[IsActive] integer

Итак, как мне объявить свое свойство IsActive, чтобы получить столбец с битом в качестве типа данных.

У меня есть еще один вопрос. Если я объявлю свойство и укажу, что оно не равно null

[NotNull]
public bool Address{ get; set; }

Затем это дает мне ошибку, когда я вызываю CreateTable(), говоря: «Для атрибута Not Null не указано значение по умолчанию».

Я попытался инициализировать это свойство в конструкторе, но это не сработало.

Как мне решить эти проблемы? Пожалуйста помоги


person Gk_999    schedule 29.01.2015    source источник


Ответы (1)


Насколько я вижу в SQLite Docs, для SQLite нет битового типа данных.

а в SQLite.Net все типы byte/boolean/ints сопоставляются с целыми числами: см. эта строка

для ошибки NotNull, дайте мне угадать:

  • У вас уже есть несколько записей в таблице
  • Теперь вы добавляете новый столбец с атрибутом NotNull.
  • SQLite пытается изменить планшет, и он падает, потому что несколько записей, в которых новый столбец теперь имеет нулевые значения

Я думаю, что это единственная ситуация, когда нужно изменить таблицу в таком порядке:

  • Добавить столбец без NotNull
  • Добавьте несколько значений столбца
  • только после того, как все записи таблицы будут иметь значение для этого столбца --> теперь вы можете добавить атрибут NotNull

Если ваша таблица пуста, параметр NotNull будет работать с самого начала.


Изменить более простое решение:

  • Добавить столбец без NotNull
ALTER TABLE Employee ADD COLUMN IsActive integer default 0; 
  • теперь вы можете добавить атрибут NotNull и снова вызвать CreateTable
[NotNull]
public bool Address{ get; set; }

await conn.CreateTableAsync<Employee>();
person CodeNoob    schedule 29.01.2015
comment
Итак, окончательный ответ: нет, это невозможно. Снимаю шляпу перед вашими исследованиями по этому поводу. И +1 за объяснение не нуля. Спасибо. - person Gk_999; 29.01.2015
comment
Что касается вашего последнего пункта, как я могу добавить атрибут NotNull после заполнения значений во всех столбцах ??? Короче говоря, как программно добавить атрибут NotNull к свойству? - person Gk_999; 29.01.2015
comment
Итак, вы уже добавили столбец и заполнили значения? ну тогда это довольно просто, вы можете просто добавить атрибут NotNull в свой столбец и снова вызвать CreateTableAsync, на этот раз он должен работать без ошибок - person CodeNoob; 29.01.2015
comment
Но как программно добавить атрибут NotNull к уже существующему свойству??? Что-то вроде IsActive .Attributes.Add('NotNull')?? - person Gk_999; 30.01.2015
comment
Или вы хотите, чтобы у меня был другой аналогичный класс с атрибутом NotNull, установленным в свойство IsActive, и вызовите метод CreateTable() для этого нового класса?? - person Gk_999; 30.01.2015
comment
На самом деле вы не можете установить атрибут во время выполнения. Обновленное решение @CodeNoob является ответом. Атрибуты — это то, что скомпилировано в класс, и их нельзя изменить во время выполнения. Конечно, вы можете прочитать все атрибуты и изменить их набор, но это никак не повлияет на класс. Короче говоря, создайте столбец без not null, заполните значения (по умолчанию), затем добавьте в поле атрибут NotNull и снова вызовите CreateTable. Это создает новую таблицу, если она не существует, и обновляет существующую. Если нечего обновлять, ничего не делает... - person nurchi; 05.02.2015