【问题标题】:xamarin-forms sqlite multi tablesxamarin-forms sqlite 多表
【发布时间】:2019-03-29 16:09:16
【问题描述】:

不能使用多个表。如何处理两张、三张或更多张桌子?

Visual Studio >>> Xamarin-Forms

/// I think maybe this code needs to be fixed somehow.
/// this code is placed in App.cs (up)
static Data.TableTwo tabletwo;
static Data.TableOne tableone;
/// crashed
 public Task<int> SaveItemAsync(TableTwo item)
        {
            if (item.ID != 0)
            {
                return tabletwo.UpdateAsync(item);
            }
            else
            {
                return tabletwo.InsertAsync(item);
            }
        } 
/// ***I think maybe this code needs to be fixed somehow.
/// this code is placed in App.cs (down below)
public static Data.TableTwo tabletwo
        {
            get
            {
                if (datadistance == null)
                {
                    tabletwo = new Data.TableTwo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "TodoSQLite.db3"));
                }
                return tabletwo;
            }
        }
/// ***I think maybe this code needs to be fixed somehow.
/// this code is placed in App.cs (down below)
        public static Data.TableOne tableone
        {
            get
            {
                if (tableone == null)
                {
                    tableone = new Data.TableOne(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "TodoSQLite.db3"));
                }
                return tableone;
            }
        }

上面的代码可以正常工作。当上面的代码被调用时。申请失败。

我有两张桌子。当用户工作时使用一张表(保存和删除数据),那么一切正常。如果用户开始使用另一个表(保存数据),应用程序就会崩溃。

!!!应用程序树!!! 数据库(文件夹) 表二(文件) 表一(文件) 模型(文件夹) 表二(文件) 表一(文件)

一切都按照文章https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/databases#using-sqlite中的代码完成

实际上,我只是将代码复制了第二次,然后粘贴到项目中。 - 这就是我创建第二个表并使用它(删除插入数据)所做的工作

【问题讨论】:

  • 我认为您应该停下来重新阅读文档。您正在创建两个单独的连接,都使用相同的数据库路径。这与在同一个数据库中创建两个表不同。应该不需要为每个表创建连接。
  • public Task&lt;int&gt; SaveItemAsync(TodoItem item) { if (item.ID != 0) { return database.UpdateAsync(item); } else { return database.InsertAsync(item); } }我可以创建一个数据库连接。但是后来我无法在表中创建单独的查询,这里我只是不明白该怎么做。我试过但失败了。
  • 做什么?您要运行哪些查询?两张表是什么?在该示例中,TodoItem 映射到一个表。如果您想要另一个表,请创建另一个将映射到另一个表的模型。

标签: sqlite xamarin.forms


【解决方案1】:

假设您的两个表属于 LoadCategory 类型,并且您的数据库属于 MyDatabase 类型 您可能希望在 MyDatabase 类中保持与 SqlLite 的单一连接,并添加与表交互的方法,如下所示:

public class MyDatabase
{
    private readonly SQLiteAsyncConnection _connection;

    public MyDatabase():this(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "MyDatabase.db3"))
    {
    }

    internal MyDatabase(string dbPath)
    {
        _connection = new SQLiteAsyncConnection(dbPath);

        _connection.CreateTableAsync<Load>().Wait();
        _connection.CreateTableAsync<Category>().Wait();
    }

    public Task<List<Load>> GetLoads() => 
        _connection.Table<Load>().ToListAsync();

    public Task<List<Category>> GetCategories() => 
        _connection.Table<Category>().ToListAsync();

    public Task<Load> GetLoad(int id) => 
        _connection.Table<Load>().Where(i => i.Id == id).FirstOrDefaultAsync();

    public Task<int> SaveLoad(Load item) =>
        item.Id != 0 ? _connection.UpdateAsync(item) : _connection.InsertAsync(item);

    public Task<int> DeleteLoad(Load item) => 
        _connection.DeleteAsync(item);
}

这是一个很好的示例:https://github.com/xamarin/xamarin-forms-samples/blob/master/Todo/Todo/Data/TodoItemDatabase.cs,但它包含一个表?

【讨论】:

    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 2021-05-05
    • 2019-03-20
    • 2016-08-03
    • 2020-06-19
    • 2021-06-06
    • 2018-11-13
    • 2017-02-28
    相关资源
    最近更新 更多