112 lines
3.8 KiB
C#
112 lines
3.8 KiB
C#
using SQLite;
|
||
using Phonebook.Models;
|
||
using System.Collections.ObjectModel;
|
||
using Contact = Phonebook.Models.Contact;
|
||
using System.Diagnostics;
|
||
using System.Globalization;
|
||
|
||
namespace Phonebook.Services
|
||
{
|
||
public class DatabaseService
|
||
{
|
||
private SQLiteAsyncConnection _database;
|
||
|
||
public DatabaseService()
|
||
{
|
||
Initialize();
|
||
}
|
||
|
||
private async void Initialize()
|
||
{
|
||
if (_database != null)
|
||
return;
|
||
|
||
_database = new SQLiteAsyncConnection(Path.Combine(FileSystem.AppDataDirectory, "contacts.db3"),
|
||
SQLiteOpenFlags.Create | SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.SharedCache);
|
||
|
||
await _database.CreateTableAsync<Contact>();
|
||
}
|
||
|
||
public async Task<List<Contact>> GetContactsAsync()
|
||
{
|
||
return await _database.Table<Contact>().ToListAsync();
|
||
}
|
||
|
||
public async Task<List<Contact>> SearchContactsAsync(string searchTerm)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(searchTerm))
|
||
return await GetContactsAsync();
|
||
|
||
// Всегда получаем все контакты и фильтруем в памяти
|
||
// Это обеспечит одинаковое поведение для всех языков
|
||
var allContacts = await GetContactsAsync();
|
||
var compareInfo = CultureInfo.CurrentCulture.CompareInfo;
|
||
|
||
return allContacts?
|
||
.Where(c =>
|
||
compareInfo.IndexOf(c.Name ?? "", searchTerm, CompareOptions.IgnoreCase) >= 0 ||
|
||
compareInfo.IndexOf(c.PhoneNumber ?? "", searchTerm, CompareOptions.IgnoreCase) >= 0 ||
|
||
compareInfo.IndexOf(c.Email ?? "", searchTerm, CompareOptions.IgnoreCase) >= 0 ||
|
||
compareInfo.IndexOf(c.Address ?? "", searchTerm, CompareOptions.IgnoreCase) >= 0 ||
|
||
compareInfo.IndexOf(c.Description ?? "", searchTerm, CompareOptions.IgnoreCase) >= 0)
|
||
.DistinctBy(c => c.Id)
|
||
.ToList() ?? new List<Contact>();
|
||
}
|
||
|
||
private bool ContainsCyrillic(string text)
|
||
{
|
||
return text.Any(c => c >= 'а' && c <= 'я' || c >= 'А' && c <= 'Я');
|
||
}
|
||
|
||
public async Task<Contact> GetContactAsync(int id)
|
||
{
|
||
return await _database.Table<Contact>().Where(c => c.Id == id).FirstOrDefaultAsync();
|
||
}
|
||
|
||
public async Task<Contact> SearchIdByNameOrDefault(Contact contact)
|
||
{
|
||
var dataList = await _database.Table<Contact>().Where(c => c.Name == contact.Name).ToListAsync();
|
||
if(dataList.Count == 0) return contact;
|
||
return dataList[0];
|
||
}
|
||
|
||
public async Task<int> SaveContactAsync(Contact contact)
|
||
{
|
||
if (contact.Id != 0)
|
||
{
|
||
return await _database.UpdateAsync(contact);
|
||
}
|
||
else
|
||
{
|
||
return await _database.InsertAsync(contact);
|
||
}
|
||
}
|
||
|
||
public async Task SaveContactsAsync(List<Contact> contacts)
|
||
{
|
||
var insertList = new List<Contact>();
|
||
var updateList = new List<Contact>();
|
||
|
||
foreach (var contact in contacts)
|
||
{
|
||
if(contact.Id != 0)
|
||
updateList.Add(contact);
|
||
else
|
||
insertList.Add(contact);
|
||
}
|
||
|
||
await _database.UpdateAllAsync(updateList);
|
||
await _database.InsertAllAsync(insertList);
|
||
}
|
||
|
||
public async Task<int> DeleteContactAsync(Contact contact)
|
||
{
|
||
return await _database.DeleteAsync(contact);
|
||
}
|
||
|
||
public async Task ClearAll()
|
||
{
|
||
await _database.DeleteAllAsync<Contact>();
|
||
}
|
||
}
|
||
} |