0

この質問の再投稿は申し訳ありませんが、の質問には、私が理解して活用できるような回答がありませんでした。その質問を復活させるべきか、それとも新しい質問を生み出すべきか、私には確信が持てませんでした。

作成したデータベース内の Part テーブルに Part オブジェクトを追加しようとしています。実行中に次のエラーが発生します

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();
        }
    }
}

Part クラスは次のとおりです。

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 が Part オブジェクトを見つけられないことをさらに示しているようですが、私はそれをusing PartsManagement.Model;の適切な using ステートメントで参照しました。. エラーの角かっこが重要かどうかはわかりません。Parts オブジェクトの特定のインスタンス化を配列として見つけようとしていますか? 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;
        }
    }

この問題の根本原因の鍵となる製品クラスを含めます。

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; }
    }
}
4

1 に答える 1

0

sqlite は配列Productの作成方法を理解していないため、テーブルの作成に失敗しています。PartFK 関係を持つテーブルが必要な場合は、SQLite Extensionsパッケージを追加する必要があります

于 2020-05-15T01:31:38.940 に答える