PCL i SQLite

0

Cześć. W mojej aplikacji wszystkie dane będą zapisywane w SQLite. Jednak napotkałem pewien opór...
Zacząłem wszystko projektować pod odpowiednie interfejsy (np. IDbConnection, IDbTransaction itd). Aplikacja ma być wieloplatformowa, więc jej jądro powstaje jako PCL. Jednak okazało się, że nigdzie nie mogę znaleźć bibliotek SQLite na PCL, które implementują te interfejsy.
Co więcej, będzie też możliwość zapisu do MySQL. Ale problem jest ten sam. Czy ktoś się orientuje co i jak?

0

Nie bardzo rozumiem czego nie możesz znaleźć... Jeżeli masz PCL (tak btw. używaj już raczej .net standard jeśli to xamarin forms :P ) no to w nim używasz sobie funkcji dostarczonych przez te interfejsy, ale samą implementację tych interfejsów robisz w projektach natywnych - na iOS inaczej będzie wyglądać ścieżka do pliku bazy niż na Android czy UWP. W NuGet są dll-ki dla SQLite na PCL :)

0

Inaczej. Tworzę aplikację, która ma być wieloplatformowa. Dlatego też jej jądro powstaje jako PCL. Wiem, że nie przeniosę w 100% kodu na inne platformy i rzeczy w stylu obsługa plików muszą być robione po stronie konkretnych programów natywnych.

Jednak szukam obsługi SQLite dla PCL. Żebym mógł go bezpośrednio używać w PCL, żeby to moje jądro samo ogarniało komunikację z bazą danych. Programy natywne mają tylko wywołać SAVE i nie wiedzieć w ogóle o bazie danych.

Jednak poza SQLite chcę mieć też obsługę innej bazy, np. MySQL. W związku z tym przygotowuję PCLa w taki sposób, żeby posługiwał się interfejsami (np. IDbConnection). Niestety SQLite jakie znalazłem do PCL nie implementują w ogóle tych interfesjów. Przykład? SQLiteConnection implementuje tylko interfejs IDisposable. Nawet nie dziedziczy po DbConnection i nie implementuje IDbConnection.

0

W związku z tym przygotowuję PCLa w taki sposób, żeby posługiwał się interfejsami (np. IDbConnection). Niestety SQLite jakie znalazłem do PCL nie implementują w ogóle tych interfesjów. Przykład? SQLiteConnection implementuje tylko interfejs IDisposable. Nawet nie dziedziczy po DbConnection i nie implementuje IDbConnection.

Mam wrażenie, ze to może wynikać z faktu, że IDbConnection jest dostępne dopiero w .NET Standard 2.0 - więc mogło nie być dostępne na często używanych profilach PCL i dlatego go obecne providery nie implementują.

0
Ktos napisał(a):

W związku z tym przygotowuję PCLa w taki sposób, żeby posługiwał się interfejsami (np. IDbConnection). Niestety SQLite jakie znalazłem do PCL nie implementują w ogóle tych interfesjów. Przykład? SQLiteConnection implementuje tylko interfejs IDisposable. Nawet nie dziedziczy po DbConnection i nie implementuje IDbConnection.

Mam wrażenie, ze to może wynikać z faktu, że IDbConnection jest dostępne dopiero w .NET Standard 2.0 - więc mogło nie być dostępne na często używanych profilach PCL i dlatego go obecne providery nie implementują.

Ale Mono jest chyba kompatybilne z 2.0, nie? Zresztą załóżmy, że to prawda. To jak sobie z tym poradzić? Nie wierzę, że nikt niczego nie wymyślił. A nie chcę tworzyć klas do SQLite od nowa :/

1

Mam wrażenie, ze to może wynikać z faktu, że IDbConnection jest dostępne dopiero w .NET Standard 2.0 - więc mogło nie być dostępne na często używanych profilach PCL i dlatego go obecne providery nie implementują.

Ale Mono jest chyba kompatybilne z 2.0, nie? Zresztą załóżmy, że to prawda. To jak sobie z tym poradzić? Nie wierzę, że nikt niczego nie wymyślił. A nie chcę tworzyć klas do SQLite od nowa :/

Liczy się najmniejszy wspólny mianownik. Taki sqlite-net-pcl deklaruje portable-net45+win+wpa81+wp80 oraz .NET Standard 1.1. Dyskryminuje go to aż do poziomu Windows Phone 8 Silverlight, w którym IDbConnection nie było.

Co do MySQL - jak tak patrzę to MySqlConnector ma klasę MySqlConnection, która dziedziczy po DbConnection. I jest dla .NET Standard 1.3 oraz 2.0.

Co do SQLite, to w sumie ciekawy jestem ile by zajęło stargetowanie tego na .NET Standard 2.0 oraz implementacja tego IDbConnection. Nie wiem czy dzisiaj będę miał czas ;)

1

Zanalizowałem jak działa SQLite-net, próbując mu zaimplementować .NET Standard 2.0. To by było sporo pracy.

Problem polega na tym, że polega na paru totalnie innych koncepcjach, na przykład na metodach ExecuteReader<T> zwracających od razu odpowiednie typy, zamiast ExecuteReader zwracającego IDbReader. O ile jeszcze same podstawowe interfejsy nie wyglądają tak strasznie, ConnectionString i DatabasePath da się potraktować jakby były jednym, to już sam Commit() i Rollback() w SQLite-net polegają na głównej klasie, a nie na klasie SQLiteDbTransaction.

Słabo to widzę - raczej zaprojektuj własne interfejsy i zrób klasy proxy, które podłączą ci się do odpowiednich, nadpisując tylko te cechy, których potrzebujesz, bo implementacja IDbConnection zajęła by trochę pracy.

0

Tutaj to by się raczej adapter przydał. No nic, dzięki za pomoc, biorę się za robienie adaptera :)

0

OK, tego SQLite-NET PCL nie da się przerobić, bo to rodzaj ORMa, a nie biblioteka do SQLite :/

Ale znalazłem coś innego. Mono.Data.Sqlite. Mój projekt targetuję na .NET 4.5. Ta biblioteka jest na .NET 4.0. NuGet nie chce jej załadować, ale gdy ją dodaję ręcznie, to wszystko śmiga. Jakie mogą być konsekwencje mieszania frameworków?

Bo teoretycznie można uruchomić aplikację .NET 4.5 w środowisku, gdzie jest 4.0. Po prostu wysypie się przy rzeczach używanych w 4.5. Natomiast tutaj nie widzę jakiegoś takiego problemu. Biblioteka dostarcza też System.Data.Portable, który nijako dubluje System.Data (dlatego też System.Data muszę wyrzucić z referencji).

1 użytkowników online, w tym zalogowanych: 0, gości: 1