Как я могу удалить столбец из моей таблицы SQLite с помощью sqlite-net-pcl, который поставляется с Xamarin Forms? - PullRequest
1 голос
/ 04 мая 2019

У меня есть таблица, которая была создана с этим кодом C #:

public class ViewHistory
{
    [PrimaryKey]
    public string YYMMDD { get; set; }
    public int UtcNow { get; set; }
    public int Assign { get; set; }
    public int Learn { get; set; }
    public int Practice { get; set; }
    public int Quiz { get; set; }

}

, а затем

db2.CreateTable<ViewHistory>();

Я хотел бы проверить, существует ли столбец Назначить, и затем удалить Назначитьстолбец, если он существует.До сих пор все предложения, которые я видел, были либо довольно старыми, либо предлагали создать новую таблицу, а также не включали никакой проверки, чтобы увидеть, существует ли она.

Теперь, с последней версией sqlite-net-pcl (1.5.2), есть ли способ удалить столбец?Если нет, то кто-то может порекомендовать способ сделать это, просто используя функции C #, которые доступны мне с PCL или с SQL, который я мог бы выполнить.

Я видел это на SO, но это мне не очень помогает:

Удалить столбец из таблицы SQLite

Ответы [ 2 ]

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

SQLite не поддерживает ALTER TABLE x DROP COLUMN x, поэтому вам нужно создать новую таблицу и скопировать данные.

Вы можете сделать все это с помощью одного многострочного оператора SQL и выполнить его, но это поможет вамхотя шаги, использующие ORM, в максимально возможной степени:

Примечание: это предполагает, что ваша модель обновлена ​​ и не включает этот столбец больше и вашу текущую базу данныхможет иметь или не иметь его ...

var conn = new SQLiteConnection(.....
conn.CreateTable<ViewHistory>();
~~~

if (0 < conn.ExecuteScalar<int>("SELECT COUNT(*) AS colcount FROM pragma_table_info('ViewHistory') WHERE name='Assign'"))
{
    try
    {
        conn.BeginTransaction();
        conn.Execute("ALTER TABLE ViewHistory RENAME TO backup;");
        conn.CreateTable<ViewHistory>();

        // Column map and copy data 
        var columns = conn.GetMapping<ViewHistory>(CreateFlags.None).Columns;
        var columnNames = string.Join(",", columns.Select(p => p.Name));
        conn.Execute($"INSERT INTO ViewHistory ({columnNames}) SELECT {columnNames} FROM backup;");

        conn.Execute("DROP TABLE backup;");
        conn.Commit();
        conn.Execute("VACUUM");
    }
    catch (Exception ex)
    {
        conn.Rollback();
        throw ex;
    }
}

Примечание: Как правило, я просто использую "Браузер БД для SQLite", делаю все изменения таблицы / столбца в базе данных и копирую "Вывод журнала БД", которыйсодержит все операторы SQL и вставляет их в один оператор SQLConnnection.Exceute ...

0 голосов
/ 04 мая 2019

Вы можете создать класс с динамическими свойствами

Вы можете обратиться по следующей ссылке
Как мне создать динамические свойства в C #?

...