Project Track – SQLite

Aplikacje mobilne mają to do siebie, że używane są na smartfonach albo tabletach, które nie zawsze mają dostęp do Internetu. Kiedy tworzymy strony internetowe to zakładamy, że użytkownik ma połączenie sieciowe i nie musimy się martwić za bardzo utratą takiego połączenia. Przy urządzeniach mobilnych sprawa jest nieco bardziej skomplikowana. Dlatego dobrym pomysłem jest posiadanie lokalnej bazy danych na urządzeniu w której możemy trzymać dane które później się synchronizują, albo są specyficzne dla konkretnego urządzenia i nie powinny wychodzić nigdzie poza nie. W związku z tym trzeba przemyśleć takie sytuacje i to też właśnie zrobiłem w tym tygodniu.

Najczęściej używaną bazą danych na urządzeniach mobilnych jest SQLite. Prosty, lekki i w miarę prosty w implementacji. Dodatkowo wsparcie dla SQLite w Xamarinie jest już świetnie pokryte w paczkach NuGetowych. Dlatego też dzisiejszy wpis powinien być całkiem krótki i przyjemny. Jedyna rzecz warta uwagi już teraz to to, że byłem zmuszony pierwszy raz „dotknąć” projektu innego niż PCL, ale to za chwilę.

Projekt PCL

Pierwsze co należało zrobić żeby móc działać z SQLitem to podciągnięcie paczki z NuGeta o nazwie SQLite.Net-PCL. Następnie musiałem stworzyć 2 klasy i jeden interfejs po to żeby to wszystko zabanglało.

public class NozbeAuthenticationData
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string Login { get; set; }
        public string Password { get; set; }
        public string APIKey { get; set; }
    }

Pierwsza klasa to model, który będzie odzwierciedlał tabelę w mojej bazie. Ach chyba zapomniałem wspomnieć, że SQLite’a będę póki co używał tylko po to żeby trzymać tam dane do logowania w Nozbe.

public interface ISQLite
    {
        SQLiteConnection GetConnection();
    }

Na drugi ogień idzie interfejs, który będzie później implementowany w poszczególnych aplikacjach (Android, iOS) tylko i wyłącznie po to żeby wiedzieć w jaki sposób otworzyć połączenie z bazą.

public class DataAccess
    {
        SQLiteConnection dbConn;
        public DataAccess()
        {
            dbConn = DependencyService.Get<ISQLite>().GetConnection();
            // create the table(s)
            dbConn.CreateTable<NozbeAuthenticationData>();
        }
        public NozbeAuthenticationData GetAuthenticationData()
        {
            return dbConn.Query<NozbeAuthenticationData>("Select * From [NozbeAuthenticationData]").FirstOrDefault();
        }
        public int SaveAuthenticationData(NozbeAuthenticationData authenticationData)
        {
            return dbConn.Insert(authenticationData);
        }
        public int DeleteAuthenticationData(NozbeAuthenticationData authenticationData)
        {
            return dbConn.Delete(authenticationData);
        }
        public int EditAuthenticationData(NozbeAuthenticationData authenticationData)
        {
            return dbConn.Update(authenticationData);
        }
    }

Drugą klasą, którą trzeba było stworzyć to klasa DataAccess. W niej za pomocą DependencyService otrzymuję implementację interfejsu ISQLite (który opiszę za chwilę) i otwieram połączenie do bazy. Dalej to kwestia stworzenia tabeli w bazie i implementacja metod do manipulacji na danych (prosty CRUD – Create, Read, Update i Delete).

Na koniec potrzebna jest jeszcze jedna drobna zmiana w klasie App.cs

static DataAccess dbUtils;
public static DataAccess DAUtil
        {
            get
            {
                if (dbUtils == null)
                {
                    dbUtils = new DataAccess();
                }
                return dbUtils;
            }
        }

Tworzę tu statyczną właściwość, która będzie inicjalizowała połączenie do bazy przy każdym odpaleniu aplikacji.

Projekt Android

No to projekt PCL został już ogarnięty, teraz pora na pierwszą zmianę w projekcie Android. W tym projekcie jedyne co trzeba zrobić to zaimplementować interfejs ISQLite w którym wskażę w jaki sposób aplikacja ma się połączyć z bazą i gdzie ta baza się znajduje.

[assembly: Dependency(typeof(SqliteService))]
namespace ProjectTrack.Droid
{
    public class SqliteService : ISQLite
    {
        public SqliteService() { }

        #region ISQLite implementation
        public SQLite.Net.SQLiteConnection GetConnection()
        {
            var sqliteFilename = "ProjectTrack.db3";
            string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // Documents folder
            var path = Path.Combine(documentsPath, sqliteFilename);
            Console.WriteLine(path);
            if (!File.Exists(path)) File.Create(path);
            var plat = new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid();
            var conn = new SQLite.Net.SQLiteConnection(plat, path);
            // Return the database connection 
            return conn;
        }

        #endregion


    }
}

No i tyle. Tak jak wspominałem łatwo i przyjemnie 🙂

Teraz już bez problemu mogę zastąpić na sztywno wpisywany klucz do API, czy login i hasło do Nozbe i korzystać już tylko i wyłącznie z danych dostępnych w bazie na smartfonie 🙂 Ekstra sprawa!

Related posts