Я пытаюсь решить проблему, когда индекс выходит за пределы допустимого диапазона, когда я удаляю объект в базе данных SQLite и создаю любые новые объекты в базе данных SQLite. замена.
Мое приложение содержит 2 страницы и 2 дополнительных класса с кодом.
Похоже, проблема заключается в методе db_refresh в MainPage, где Количество каждого термина не уменьшается по сравнению со счетчиком списка терминов, что приводит к ошибке Index. Вот синтаксис ошибки:
Код: Выделить всё
System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')'
MainPage.xaml.cs
Код: Выделить всё
public partial class MainPage : ContentPage
{
public static List termList = new List();
public static string dbLocation = Path.Combine(FileSystem.AppDataDirectory, "MyData.db");
public MainPage()
{
File.Delete(dbLocation);
dbActions.initiateDbTables();
InitializeComponent();
db_refresh();
generateInterface();
}
protected override void OnAppearing()
{
AppShell.SetBackgroundColor(this, Color.FromRgb(0, 0, 0));
db_refresh();
generateInterface();
}
public static void db_refresh()
{
termList.Clear();
var dataBase = new SQLiteConnection(dbLocation);
var queriedTerm = dataBase.Query("SELECT * FROM Terms");
foreach (Term eachTerm in queriedTerm)
{
termList.Add(eachTerm);
}
}
public void generateInterface()
{
termView.Children.Clear();
foreach (Term myTerm in termList)
{
Button termNameButton = new Button
{
Text = myTerm.termName,
BackgroundColor = Colors.Green,
TextColor = Colors.White,
FontAttributes = FontAttributes.Bold,
};
termNameButton.Clicked += async (sender, e) =>
{
await Navigation.PushAsync(new TermPage(myTerm.termId));
};
termView.Children.Add(termNameButton);
}
Button termAddButton = new Button()
{
Text = "Add Term",
BackgroundColor = Colors.Black,
TextColor = Colors.White,
FontAttributes = FontAttributes.Bold,
};
termAddButton.Clicked += void (sender, args) => clickNewTerm();
termView.Children.Add(termAddButton);
}
public void clickNewTerm()
{
dbActions.addNewDbTerm();
generateInterface();
}
}
Код: Выделить всё
public Term currentTerm;
public SQLiteConnection dbConnect = new SQLiteConnection(MainPage.dbLocation);
public TermPage(int termId)
{
InitializeComponent();
ButtonAdd();
Term myTerm = MainPage.termList[termId - 1];
currentTerm = myTerm;
termName.Text = currentTerm.termName;
}
private void ButtonAdd()
{
Button deleteTermButton = new Button()
{
Text = "Delete Term",
BackgroundColor = Colors.Red,
FontAttributes = FontAttributes.Bold,
};
deleteTermButton.Clicked += void (sender, args) => actionDeleteTerm();
TermPageView.Children.Add(deleteTermButton);
}
public async void actionDeleteTerm()
{
dbConnect.Delete(currentTerm);
MainPage.db_refresh();
await Navigation.PopAsync();
}
Код: Выделить всё
public class dbActions
{
public static void initiateDbTables()
{
var dbLocation = Path.Combine(FileSystem.AppDataDirectory, "MyData.db");
var dbConnect = new SQLiteConnection(dbLocation);
dbConnect.CreateTable();
}
public static void addNewDbTerm()
{
var dbConnect = new SQLiteConnection(MainPage.dbLocation);
var dbQuery = dbConnect.Query($"SELECT * FROM Terms ORDER BY termId DESC LIMIT 1");
if (dbQuery.Count != 0)
{
Term topTerm = dbQuery.First();
string termName = "Term " + (topTerm.termId + 1).ToString();
Term newTerm = new Term(termName, DateTime.Now, DateTime.Now.AddDays(60));
dbConnect.Insert(newTerm);
MainPage.db_refresh();
}
else
{
Term newTerm = new Term("Term1", DateTime.Now, DateTime.Now.AddDays(60));
dbConnect.Insert(newTerm);
MainPage.db_refresh();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... ites-table