fix crash of sqlite in release mode
This commit is contained in:
@ -28,68 +28,97 @@ namespace Billing.Store
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (database != null)
|
||||
try
|
||||
{
|
||||
await database.CloseAsync();
|
||||
if (database != null)
|
||||
{
|
||||
await database.CloseAsync();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Helper.Error("database.close", ex);
|
||||
}
|
||||
try
|
||||
{
|
||||
File.Copy(file, path, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Helper.Error("file.import", ex);
|
||||
}
|
||||
try
|
||||
{
|
||||
database = new SQLiteAsyncConnection(path,
|
||||
SQLiteOpenFlags.ReadWrite |
|
||||
SQLiteOpenFlags.Create |
|
||||
SQLiteOpenFlags.SharedCache);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Helper.Error("database.connect", ex);
|
||||
}
|
||||
File.Copy(file, path, true);
|
||||
database = new SQLiteAsyncConnection(path,
|
||||
SQLiteOpenFlags.ReadWrite |
|
||||
SQLiteOpenFlags.Create |
|
||||
SQLiteOpenFlags.SharedCache);
|
||||
return true;
|
||||
}
|
||||
|
||||
private static readonly AsyncLazy<StoreHelper> Instance = new(async () =>
|
||||
public static readonly AsyncLazy<StoreHelper> Instance = new(async () =>
|
||||
{
|
||||
var instance = new StoreHelper();
|
||||
await database.CreateTablesAsync<Category, Account, Bill>();
|
||||
var count = await database.ExecuteScalarAsync<int>("SELECT COUNT(Id) FROM [Category]");
|
||||
if (count <= 0)
|
||||
try
|
||||
{
|
||||
// init categories
|
||||
await database.InsertAllAsync(new List<Category>
|
||||
await database.CreateTablesAsync<Category, Account, Bill>();
|
||||
} catch (Exception ex)
|
||||
{
|
||||
Helper.Error("database.init.table", ex);
|
||||
}
|
||||
try
|
||||
{
|
||||
var count = await database.ExecuteScalarAsync<int>("SELECT COUNT(Id) FROM [Category]");
|
||||
if (count <= 0)
|
||||
{
|
||||
// sample categories
|
||||
new() { Name = Resource.Clothing, Icon = "clothes" },
|
||||
new() { Name = Resource.Food, Icon = "food" },
|
||||
new() { Name = Resource.Daily, Icon = "daily" },
|
||||
new() { Name = Resource.Trans, Icon = "trans" },
|
||||
new() { Name = Resource.Entertainment, Icon = "face" },
|
||||
new() { Name = Resource.Learn, Icon = "learn" },
|
||||
new() { Name = Resource.Medical, Icon = "medical" },
|
||||
new() { Name = Resource.OtherSpending, Icon = "plus" },
|
||||
// init categories
|
||||
await database.InsertAllAsync(new List<Category>
|
||||
{
|
||||
// sample categories
|
||||
new() { Name = Resource.Clothing, Icon = "clothes" },
|
||||
new() { Name = Resource.Food, Icon = "food" },
|
||||
new() { Name = Resource.Daily, Icon = "daily" },
|
||||
new() { Name = Resource.Trans, Icon = "trans" },
|
||||
new() { Name = Resource.Entertainment, Icon = "face" },
|
||||
new() { Name = Resource.Learn, Icon = "learn" },
|
||||
new() { Name = Resource.Medical, Icon = "medical" },
|
||||
new() { Name = Resource.OtherSpending, Icon = "plus" },
|
||||
|
||||
new() { Type = CategoryType.Income, Name = Resource.Earnings, Icon = "#brand#btc" },
|
||||
new() { Type = CategoryType.Income, Name = Resource.OtherIncome, Icon = "plus" },
|
||||
new() { Type = CategoryType.Income, Name = Resource.Earnings, Icon = "#brand#btc" },
|
||||
new() { Type = CategoryType.Income, Name = Resource.OtherIncome, Icon = "plus" },
|
||||
|
||||
// sub-categories
|
||||
new() { ParentId = 1, Name = Resource.Jewellery, Icon = "gem" },
|
||||
new() { ParentId = 1, Name = Resource.Cosmetics, Icon = "makeup" },
|
||||
new() { ParentId = 2, Name = Resource.Brunch, Icon = "brunch" },
|
||||
new() { ParentId = 2, Name = Resource.Dinner, Icon = "dinner" },
|
||||
new() { ParentId = 2, Name = Resource.Drinks, Icon = "drink" },
|
||||
new() { ParentId = 2, Name = Resource.Fruit, Icon = "fruit" },
|
||||
new() { ParentId = 3, Name = Resource.UtilityBill, Icon = "bill" },
|
||||
new() { ParentId = 3, Name = Resource.PropertyFee, Icon = "fee" },
|
||||
new() { ParentId = 3, Name = Resource.Rent, Icon = "rent" },
|
||||
new() { ParentId = 3, Name = Resource.Maintenance, Icon = "maintenance" },
|
||||
new() { ParentId = 4, Name = Resource.LightRail, Icon = "rail" },
|
||||
new() { ParentId = 4, Name = Resource.Taxi, Icon = "taxi" },
|
||||
new() { ParentId = 5, Name = Resource.Fitness, Icon = "fitness" },
|
||||
new() { ParentId = 5, Name = Resource.Party, Icon = "party" },
|
||||
new() { ParentId = 9, Type = CategoryType.Income, Name = Resource.Salary, Icon = "#brand#buffer" },
|
||||
new() { ParentId = 9, Type = CategoryType.Income, Name = Resource.Bonus, Icon = "dollar" },
|
||||
});
|
||||
// sub-categories
|
||||
new() { ParentId = 1, Name = Resource.Jewellery, Icon = "gem" },
|
||||
new() { ParentId = 1, Name = Resource.Cosmetics, Icon = "makeup" },
|
||||
new() { ParentId = 2, Name = Resource.Brunch, Icon = "brunch" },
|
||||
new() { ParentId = 2, Name = Resource.Dinner, Icon = "dinner" },
|
||||
new() { ParentId = 2, Name = Resource.Drinks, Icon = "drink" },
|
||||
new() { ParentId = 2, Name = Resource.Fruit, Icon = "fruit" },
|
||||
new() { ParentId = 3, Name = Resource.UtilityBill, Icon = "bill" },
|
||||
new() { ParentId = 3, Name = Resource.PropertyFee, Icon = "fee" },
|
||||
new() { ParentId = 3, Name = Resource.Rent, Icon = "rent" },
|
||||
new() { ParentId = 3, Name = Resource.Maintenance, Icon = "maintenance" },
|
||||
new() { ParentId = 4, Name = Resource.LightRail, Icon = "rail" },
|
||||
new() { ParentId = 4, Name = Resource.Taxi, Icon = "taxi" },
|
||||
new() { ParentId = 5, Name = Resource.Fitness, Icon = "fitness" },
|
||||
new() { ParentId = 5, Name = Resource.Party, Icon = "party" },
|
||||
new() { ParentId = 9, Type = CategoryType.Income, Name = Resource.Salary, Icon = "#brand#buffer" },
|
||||
new() { ParentId = 9, Type = CategoryType.Income, Name = Resource.Bonus, Icon = "dollar" },
|
||||
});
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Helper.Error("database.init.category", ex);
|
||||
}
|
||||
return instance;
|
||||
});
|
||||
|
||||
public static async Task<List<Account>> GetAccountsAsync()
|
||||
{
|
||||
var instance = await Instance;
|
||||
return await instance.GetListAsync<Account>();
|
||||
}
|
||||
public static async Task<int> SaveAccountItemAsync(Account account)
|
||||
{
|
||||
var instance = await Instance;
|
||||
@ -101,11 +130,6 @@ namespace Billing.Store
|
||||
return await instance.DeleteItemAsync(account);
|
||||
}
|
||||
|
||||
public static async Task<List<Bill>> GetBillsAsync()
|
||||
{
|
||||
var instance = await Instance;
|
||||
return await instance.GetListAsync<Bill>();
|
||||
}
|
||||
public static async Task<int> SaveBillItemAsync(Bill bill)
|
||||
{
|
||||
var instance = await Instance;
|
||||
@ -117,11 +141,6 @@ namespace Billing.Store
|
||||
return await instance.DeleteItemAsync(bill);
|
||||
}
|
||||
|
||||
public static async Task<List<Category>> GetCategoriesAsync()
|
||||
{
|
||||
var instance = await Instance;
|
||||
return await instance.GetListAsync<Category>();
|
||||
}
|
||||
public static async Task<int> SaveCategoryItemAsync(Category category)
|
||||
{
|
||||
var instance = await Instance;
|
||||
@ -137,10 +156,17 @@ namespace Billing.Store
|
||||
{
|
||||
if (database == null)
|
||||
{
|
||||
database = new SQLiteAsyncConnection(DatabasePath,
|
||||
SQLiteOpenFlags.ReadWrite |
|
||||
SQLiteOpenFlags.Create |
|
||||
SQLiteOpenFlags.SharedCache);
|
||||
try
|
||||
{
|
||||
database = new SQLiteAsyncConnection(DatabasePath,
|
||||
SQLiteOpenFlags.ReadWrite |
|
||||
SQLiteOpenFlags.Create |
|
||||
SQLiteOpenFlags.SharedCache);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Helper.Error("database.ctor.connect", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -178,7 +204,7 @@ namespace Billing.Store
|
||||
|
||||
#region Helper
|
||||
|
||||
private Task<List<T>> GetListAsync<T>() where T : new()
|
||||
public Task<List<T>> GetListAsync<T>() where T : new()
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -191,7 +217,7 @@ namespace Billing.Store
|
||||
return default;
|
||||
}
|
||||
|
||||
private Task<int> SaveItemAsync<T>(T item) where T : IIdItem
|
||||
public Task<int> SaveItemAsync<T>(T item) where T : IIdItem
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -211,7 +237,7 @@ namespace Billing.Store
|
||||
return Task.FromResult(0);
|
||||
}
|
||||
|
||||
private Task<int> DeleteItemAsync<T>(T item) where T : IIdItem
|
||||
public Task<int> DeleteItemAsync<T>(T item) where T : IIdItem
|
||||
{
|
||||
try
|
||||
{
|
||||
|
Reference in New Issue
Block a user