以编程方式创建SQLite表

时间:2017-02-10 06:43:28

标签: c# sqlite xamarin.forms

我正在创建一个Xamarin Forms应用程序。该应用程序包含一个创建新列表的按钮。列表的名称和日期保存在一个表中,但列表的内容必须存储在另一个表中,需要使用查询创建。我已经能够使用以下方法成功地将记录插入到包含列表名称和日期的表中:

[Table("ToDoLists")]
public class ShoppingList : INotifyPropertyChanged
{
    private int _id;

    [PrimaryKey, AutoIncrement]
    public int Id
    {
        get
        {
            return _id;
        }

        set
        {
            _id = value;
            OnPropertyChanged(nameof(Id));
        }
    }

    private string _name;

    [NotNull]
    public string Name
    {
        get
        {
            return _name;
        }

        set
        {
            _name = value;
            OnPropertyChanged(nameof(Name));
        }
    }

    private string _date;

    [NotNull]
    public string Date
    {
        get
        {
            return _date;
        }

        set
        {
            _date = value;
            OnPropertyChanged(nameof(Date));
        }
    }

    private string _description;

    [NotNull]
    public string Description
    {
        get
        {
            return _description;
        }

        set
        {
            _description = value;
            OnPropertyChanged(nameof(Description));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

我尝试了以下事项:

  • [Table(tableName)]语句中将列表名称作为表名传递,但IDE告诉我只允许使用常量字段,这意味着我无法动态指定表名
  • 我试过阅读SQLiteCommand,但我给出的示例使用了SQLite PCL中无法使用的功能(除非我已经错误地安装了SQLite PCL)。

我究竟如何在SQLite PCL中使用查询创建表格?它甚至可能吗?有什么建议吗?

1 个答案:

答案 0 :(得分:2)

看看SQLite-net

  

SQLite-net是一个开源的最小库,允许.NET和Mono应用程序在SQLite 3数据库中存储数据。它最初是为与Xamarin.iOS合作而设计的,但后来在所有平台(Xamarin。* ,. NET,UWP,Azure等)上工作。

     

SQLite-net被设计为一个快速方便的数据库层。它的   设计遵循以下目标:

     
      
  • 非常容易与现有项目集成,并可在所有.NET平台上运行。
  •   
  • SQLite上的薄包装,快速高效。 (此库不应成为查询的性能瓶颈。)
  •   
  • 非常简单的方法,用于安全地执行CRUD操作和查询(使用参数)以及检索结果   以强类型的方式查询。
  •   
  • 使用您的数据模型而不强制您更改类。 (包含一个小的反射驱动的ORM层。)
  •   

首先,为您的数据库创建一个SQLiteAsyncConnection

private SQLiteAsyncConnection database; 
database = new SQLiteAsyncConnection("YourDatabasePath");

然后您可以使用CreateTableAsync()方法创建表格:

await database.CreateTableAsync<ShoppingList>();

要向表中添加数据,您可以执行以下操作:

public async Task SaveShoppingObjects(List<ShoppingObjects> shoppingsObjects)
{
    await database.RunInTransactionAsync(tran =>
    {
        foreach (ShoppingObject s in shoppingObjects)
        {
            tran.InsertOrReplace(SqliteEntityFactory.Create(s));
        }
    });
}

SqliteEntityFactory.Create是一种帮助您创建表元素的方法。它可能看起来像这样:

public static ShoppingList Create(ShoppingObject s)
{
    ShoppingList slist = new ShoppingList();
    if (s == null)
    {
        return slist;
    }
    slist.Id = s.Id;
    slist.Name = s.Name;
    // etc...

    return slist;
}

如果我理解你的问题,那应该成功!

相关问题