簡體   English   中英

Xamarin.Forms SQLite 異常 - 不知道 PartsManagement.Models.Part[] (<- 自定義類)

[英]Xamarin.Forms SQLite exception - don't know about PartsManagement.Models.Part[] (<- a custom class)

對於這個問題的重新發布,我感到很抱歉,但原始問題從未以我可以理解和利用的方式得到回答。 我不確定是否應該嘗試重新提出這個問題或產生一個新問題。

我正在嘗試將零件 object 添加到我創建的數據庫中的零件表中。 我在執行過程中收到以下錯誤

System.AggregateException
      Message=One or more errors occurred. (Don't know about PartsManagement.Models.Part[])
      Source=mscorlib
      StackTrace:
      at System.Threading.Tasks.Task.ThrowIfExceptional (System.Boolean includeTaskCanceledExceptions) [0x00011] in /Users/builder/jenkins/workspace/archive-mono/2019-10/android/release/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2027 
      at System.Threading.Tasks.Task.Wait (System.Int32 millisecondsTimeout, System.Threading.CancellationToken cancellationToken) [0x00043] in /Users/builder/jenkins/workspace/archive-mono/2019-10/android/release/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2759 
      at System.Threading.Tasks.Task.Wait () [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2019-10/android/release/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2625 
      at PartsManagement.Database..ctor (System.String dbPath) [0x00027] in C:\Users\5w3rv0\source\repos\PartsManagement\PartsManagement\PartsManagement\Database.cs:18 
      at PartsManagement.App.get_Database () [0x0000e] in C:\Users\5w3rv0\source\repos\PartsManagement\PartsManagement\PartsManagement\App.xaml.cs:20 
      at PartsManagement.Views.NewPartPage.Save_Clicked (System.Object sender, System.EventArgs e) [0x00057] in C:\Users\5w3rv0\source\repos\PartsManagement\PartsManagement\PartsManagement\Views\NewPartPage.xaml.cs:25 
      at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__7_0 (System.Object state) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2019-10/android/release/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1021 
      at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0 () [0x00000] in <4ccdb3137d974856b786e1aeebbfbab6>:0 
      at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <4ccdb3137d974856b786e1aeebbfbab6>:0 
      at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in <4ccdb3137d974856b786e1aeebbfbab6>:0 
      at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.71(intptr,intptr)

從錯誤消息中,我確定錯誤似乎發生在執行第 25 行期間

await App.Database.SavePartAsync(new Part
            {
                Name = partName.Text,
                Description = partDescription.Text
            });

在 NewPartsPage.xaml.cs 文件中:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

using PartsManagement.Models;

namespace PartsManagement.Views
{
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class NewPartPage : ContentPage
    {
        public NewPartPage()
        {
            InitializeComponent();
        }

        async void Save_Clicked(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(partName.Text) && !string.IsNullOrWhiteSpace(partDescription.Text))
            {
                await App.Database.SavePartAsync(new Part
                {
                    Name = partName.Text,
                    Description = partDescription.Text
                });
            }
            await Navigation.PopModalAsync();
        }

        async void Cancel_Clicked(object sender, EventArgs e)
        {
            await Navigation.PopModalAsync();
        }
    }
}

這是 class 部分:

using SQLite;

namespace PartsManagement.Models
{
    public class Part
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
}

和數據庫文件:

using System.Collections.Generic;
using System.Threading.Tasks;
using SQLite;

using PartsManagement.Models;

namespace PartsManagement
{
    public class Database
    {
        readonly SQLiteAsyncConnection _database;

        public Database(string dbPath)
        {
            _database = new SQLiteAsyncConnection(dbPath);
            _database.CreateTableAsync<Part>().Wait();
            _database.CreateTableAsync<Product>().Wait();
        }

        public Task<List<Part>> GetPartsAsync()
        {
            return _database.Table<Part>().ToListAsync();
        }

        public Task<int> SavePartAsync(Part aPart)
        {
            return _database.InsertAsync(aPart);
        }

        public Task<List<Product>> GetProductsAsync()
        {
            return _database.Table<Product>().ToListAsync();
        }

        public Task<int> SaveProductAsync(Part aProduct)
        {
            return _database.InsertAsync(aProduct);
        }
    }
}

該錯誤似乎進一步表明 NewPartsPage 找不到零件 object,但我已通過使用 PartsManagement.Model 的正確使用語句引用它; . 我不確定錯誤中的方括號是否重要。 它是否試圖將零件 object 的特定實例化為數組? 我已經查看了sqlite 關鍵字,但其中似乎沒有包含 Part。 我的文件夾結構是否會影響我正在尋找的功能? 我已在本地數據庫教程中執行了此功能,但此示例的不同之處在於我嘗試使用不同的文件夾結構。 不知道這會如何影響,但以防萬一我提出來。
此示例文件夾結構

    static Database database;

    public static Database Database
    {
        get
        {
            if (database == null)
            {
                database = new Database(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Inventory.db3"));
            }
            return database;
        }
    }

包括產品 class 因為它是導致此問題的根本原因的關鍵。

using SQLite;

namespace PartsManagement.Models
{
    public class Product
    {
        [PrimaryKey, AutoIncrement]
        public string ID { get; set; }
        public string Name { get; set; }
        public int Cost { get; set; }
        public int OnHand { get; set; }
        public int UsedIn { get; set; }
        public double AveragePerProduct { get; set; }
        public int NumberSold { get; set; }
        public double Price { get; set; }
        public Part[] PartsIn { get; set; }
    }
}

創建Product表時失敗,因為 sqlite 不了解如何創建Part數組。 如果您想要具有 FK 關系的表,您需要添加SQLite Extensions package

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM