gpt4 book ai didi

c# - Xamarin 项目中 SQLite-Net 的通用存储库

转载 作者:IT王子 更新时间:2023-10-29 04:29:06 27 4
gpt4 key购买 nike

我想知道是否有一种方法可以为我的 Xamarin 项目编写一个通用存储库,而不是为我的对象中的每个实体编写一个不同的存储库。 Xamarin Tasky Pro示例有一个用于任务实体的存储库,因为这是它拥有的唯一实体。

在我自己的项目中,我有多个实体,所以我的问题是如何制作下面的 Customer Repository 变得通用,以便 ProductManager、EmployeeManager 等可以使用它。如果您知道示例或博客文章,请为我指明正确的方向

namespace App.DataLayer
{
public class CustomerRepository
{
private ProntoDatabase _db = null;
protected static string DbLocation;
protected static CustomerRepository Me;

static CustomerRepository()
{
Me = new CustomerRepository();
}

protected CustomerRepository()
{
//set the db location;
DbLocation = DatabaseFilePath;

//instantiate the database
_db = new ProntoDatabase(DbLocation);
}


public static string DatabaseFilePath
{
get
{
const string sqliteFilename = "CustomerDB.db3";
var libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var path = Path.Combine(libraryPath, sqliteFilename);
return path;
}
}


// CRUD (Create, Read, Update and Delete) methods

public static Customer GetCustomer(int id)
{
return Me._db.GetItem<Customer>(id);
}

public static IEnumerable<Customer> GetCustomers()
{
return Me._db.GetItems<Customer>();
}

public static int SaveCustomer(Customer item)
{
return Me._db.SaveItem(item);
}

public static int DeleteCustomer(int id)
{
return Me._db.DeleteItem<Customer>(id);
}
}

最佳答案

这是一个老问题,但这是我的实现。

我使用异步连接,因为它们在移动项目中提供更好的性能。我安装的掘金是Core项目上的Sqlite.Net-PCL/SQLite.Net.Async-PCL和Android项目上的相应nuget。

我的存储库如下所示:

using System;
using System.Collections.Generic;
using Core.Models;
using SQLite.Net;
using System.Linq;
using SQLite.Net.Async;
using System.Threading.Tasks;
using System.Linq.Expressions;

namespace Core.Managers
{
public interface IRepository<T> where T : class, new()
{
Task<List<T>> Get();
Task<T> Get(int id);
Task<List<T>> Get<TValue>(Expression<Func<T, bool>> predicate = null, Expression<Func<T, TValue>> orderBy = null);
Task<T> Get(Expression<Func<T, bool>> predicate);
AsyncTableQuery<T> AsQueryable();
Task<int> Insert(T entity);
Task<int> Update(T entity);
Task<int> Delete(T entity);
}

public class Repository<T> : IRepository<T> where T : class, new()
{
private SQLiteAsyncConnection db;

public Repository(SQLiteAsyncConnection db)
{
this.db = db;
}

public AsyncTableQuery<T> AsQueryable() =>
db.Table<T>();

public async Task<List<T>> Get() =>
await db.Table<T>().ToListAsync();

public async Task<List<T>> Get<TValue>(Expression<Func<T, bool>> predicate = null, Expression<Func<T, TValue>> orderBy = null)
{
var query = db.Table<T>();

if (predicate != null)
query = query.Where(predicate);

if (orderBy != null)
query = query.OrderBy<TValue>(orderBy);

return await query.ToListAsync();
}

public async Task<T> Get(int id) =>
await db.FindAsync<T>(id);

public async Task<T> Get(Expression<Func<T, bool>> predicate) =>
await db.FindAsync<T>(predicate);

public async Task<int> Insert(T entity) =>
await db.InsertAsync(entity);

public async Task<int> Update(T entity) =>
await db.UpdateAsync(entity);

public async Task<int> Delete(T entity) =>
await db.DeleteAsync(entity);
}
}

关于如何使用它的一些例子:

var connection = new SQLiteAsyncConnection(() => sqlite.GetConnectionWithLock());
await connection.CreateTablesAsync<Ingredient, Stock>();

IRepository<Stock> stockRepo = new Repository<Stock>(connection);
IRepository<Ingredient> ingredientRepo = new Repository<Ingredient>(connection);

var stock1 = new Stock {
IngredientId = 1,
DaysToExpire = 3,
EntryDate = DateTime.Now,
Location = StockLocations.Fridge,
MeasureUnit = MeasureUnits.Liter,
Price = 5.50m,
ProductName = "Leche Auchan",
Quantity = 3,
Picture = "test.jpg",
Family = IngredientFamilies.Dairy
};

var stockId = await stockRepo.Insert(stock1);

var all = await stockRepo.Get();
var single = await stockRepo.Get(72);
var search = await stockRepo.Get(x => x.ProductName.StartsWith("something"));
var orderedSearch = await stockRepo.Get(predicate: x => x.DaysToExpire < 4, orderBy: x => x.EntryDate);

如果Repository不能满足你的查询需求,可以使用AsQueryable():

public async Task<List<Stock>> Search(string searchQuery, StockLocations location, IngredientFamilies family)
{
var query = stockRepo.AsQueryable();

if (!string.IsNullOrEmpty(searchQuery))
{
query = query.Where(x => x.ProductName.Contains(searchQuery) || x.Barcode.StartsWith(searchQuery));
}
if (location != StockLocations.All)
{
query = query.Where(x => x.Location == location);
}
if (family != IngredientFamilies.All)
{
query = query.Where(x => x.Family == family);
}

return await query.OrderBy(x => x.ExpirationDays).ToListAsync();
}

关于c# - Xamarin 项目中 SQLite-Net 的通用存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29050400/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com