![](/img/trans.png)
[英]Xamarin.Forms SQLite exception - don't know about <Custom Class>
[英]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.