[Źródło: https://docs.microsoft.com/en-us/dotnet/]
Program:
Dokładniejsze informacje o bibliotece można znaleźć w serwisie Github ( https://github.com/sqlcipher/sqlite-net ).
Z opisanej biblioteki najbardziej potrzebna i warta uwagi wydaje mi się opcja SQLCipher, która pozwoli na dosyć zaawansowane zabezpieczenie bazy danych przed odczytem.
Na samym początku przedstawię widok bazy z tymi samymi danymi. Jedna zabezpieczona przed dostępem. Druga dostępna bez żadnych zabezpieczeń. Do odczytu wykorzystam program Atom.
Poniżej screen z prostego odczytu bazy danych niezabezpieczonej:
Jak można zaobserwować na obrazku powyżej struktura bazy danych jak i dostępne dane są widoczne i dostępne w bardzo łatwy sposób.
Poniżej screen z prostego odczytu bazy danych zabezpieczonej:
Jak teraz można zaobserwować baza danych jest kompletnie nieczytelna.
Poniżej sposób przygotowania bazy danych bez zabezpieczenia:
- var dataBase= new SQLiteConnection("dataBase1");
W przypadku bazy danych zabezpieczonej ustanowienie połączenia wygląda nieco inaczej:
- var options = new SQLiteConnectionString("dataBase1", true, key: "password",
- preKeyAction: db => db.Execute("PRAGMA cipher_default_use_hmac = OFF;"),
- postKeyAction: db => db.Execute("PRAGMA kdf_iter = 128000;"));
- var encryptedDb2 = new SQLiteConnection(options);
Strukturę baz danych jest określona w dwóch klasach:
- public class Company
- {
- [PrimaryKey, AutoIncrement]
- public int Id { get; set; }
- public string CompanyName { get; set; }
- public string CompanyKeyA { get; set; }
- public string CompanyKeyB { get; set; }
- }
- public class Valuation
- {
- [PrimaryKey, AutoIncrement]
- public int Id { get; set; }
- [Indexed]
- public int CompanyId { get; set; }
- public DateTime Time { get; set; }
- }
Aby stworzyć tablicę wewnątrz bazy danych należy wywołać następującą komendę:
- encryptedDb2.CreateTable<Company>();
- encryptedDb2.CreateTable<Valuation>();
W celu odczytania danych z bazy i załadowaniu ich do kontrolki DataGrid można posłużyć się następującą funkcją:
- public void LoadDataFromDB()
- {
- List<Company> CompaniesData = new List<Company>();
- CompaniesData.Clear();
- var query = encryptedDb2.Table<Company>();
- foreach (var stock in query)
- {
- CompaniesData.Add(new Company()
- {
- Id = company.Id,
- CompanyName = company.CompanyName,
- CompanyKeyA = company.CompanyKeyA,
- CompanyKeyB = company.CompanyKeyB
- });
- }
- DG1.ItemsSource = CompaniesData;
- DG1.Items.Refresh();
- }
Dane można pobrać także modyfikując rozkaz. Tak aby pobrać dane po określonym parametrze:
- var query = encryptedDb2.Table<Company>().Where(v => v.Symbol.StartsWith("T"));
Dodanie wartości do bazy danych:
- public void AddStock(SQLiteConnection db, string companyName, string companyKeyA, string companyKeyB)
- {
- var company = new Company()
- {
- CompanyName = companyName,
- CompanyKeyA = companyKeyA,
- CompanyKeyB = companyKeyB
- };
- int addVal = db.Insert(company);
- LoadDataFromDB();
- if(addVal == 0x01)
- {
- MessageBox.Show("Dodano dane do bazy danych", "Dodanie danych", MessageBoxButton.OK, MessageBoxImage.Information);
- }
- else
- {
- MessageBox.Show("Poprawnie usunięte dane z pamięci.", "Usuwanie danych",MessageBoxButton.OK, MessageBoxImage.Information);
- }
- }
Usunięcie wartości:
- public void DeleteStock(SQLiteConnection db, int selectedCompanyID, string companyName, string companyKeyA, string companyKeyB)
- {
- var company= new Company()
- {
- Id = selectedCompanyID,
- CompanyName = companyName,
- CompanyKeyA = companyKeyA,
- CompanyKeyB = companyKeyB
- };
- int value = db.Delete(company);
- LoadDataFromDB();
- if(value >= 0x01)
- {
- MessageBox.Show("Poprawnie usunięte dane z pamięci.", "Usuwanie danych",
- MessageBoxButton.OK, MessageBoxImage.Information);
- }
- else
- {
- MessageBox.Show("Błąd usuwania danych z pamięci.", "Usuwanie danych",
- MessageBoxButton.OK, MessageBoxImage.Error);
- }
- }
Powyżej usunięcie następuje po wprowadzeniu pełnych wartości z kolumn. Poniżej sposób usunięcia wartości na podstawie wartości jednej zmiennej:
- private void DeleteValue(string val)
- {
- var query = encryptedDb2.Table<Company>().Delete(v => v.CompanyName == val);
- LoadDataFromDB();
- }
Edycja wartości:
- public void UpdateStock(SQLiteConnection db, int selectedCompanyID, string companyName,
- string companyKeyA, string companyKeyB)
- {
- var company = new Company()
- {
- Id = selectedCompanyID,
- CompanyName = companyName,
- CompanyKeyA = companyKeyA,
- CompanyKeyB = companyKeyB
- };
- int UpdateValue = db.Update(company);
- LoadDataFromDB();
- if (UpdateValue == 0x01)
- {
- MessageBox.Show("Aktualizacja danych przeprowadzone poprawnie.", "Aktualizacja danych",
- MessageBoxButton.OK, MessageBoxImage.Information);
- }
- else
- {
- MessageBox.Show("Błąd aktualizacji danych", "Aktualizacja danych",
- MessageBoxButton.OK, MessageBoxImage.Error);
- }
- }