SQLite in Xamarin.Forms
-
Upload
guido-magrin -
Category
Software
-
view
151 -
download
6
Transcript of SQLite in Xamarin.Forms
Creare app native su iOS, Android, Mac & Windows in C#
Guido MagrinXamarin Student Ambassador@GuidoMagrin
Gli Xamarin Student Ambassadors
https://www.facebook.com/XSAMilano
Oggi parleremo di…
Local Storage
Cosa impareremo oggi?
• Conoscere il mondo dei Database• Realizzare query• Implementare SQLite in un’app
Xamarin.Forms
Quando NON usare un Database
• Impostazioni utente• File di testo• File di dati serializzati (XML, JSON)• Immagini
Per tutte queste esigenze, conviene usare il file-system o metodi propri della piattaforma usata (iCloud, OneDrive, etc)
Quando usare un Database
Più in generale, tutte le volte che ho bisogno di archiviare dati che poi posso voler trasmettere online, tramite per esempio i Mobile Services di Microsoft Azure.
• Database
Ma...
...cos’è esattamenteun database?
Introduzione ai database
• Un database è una struttura in grado di memorizzare dati in maniera ordinata.
• Sui dati memorizzati in un database posso effetturare query per leggerli o manipolarli in un qualsiasi modo.
• Il database mette a dispozione strumenti per garantire l’integrità e la coerenza dei dati memorizzati al suo interno.
Le tabelle
• I dati vengono memorizzati in tabelle.
• Ogni riga della tabella (detta n-pla) è univocamente identificata da un attributo univoco, chiamato chiave primaria.
Le query
• Le query servono ad interagire con le tabelle• Con una query posso:
– visualizzare dati di una tabella, filtrandoli secondo certi criteri– aggiungere dati ad una tabella– modificare dati in una tabella– eliminare dati da una tabella– incrociare dati tra tabelle (metodi di “join”)– creare una nuova tabella
La prima query
SELECT [selezione verticale]FROM [nome tabella]WHERE [selezione orizzontale] LIKE [parametro];
Esempi di query
SELECT *FROM Voti;
SELECT *FROM VotiWHERE Matricola=“803012”;
SELECT *FROM VotiWHERE MatricolaLIKE ‘%2’;
SELECT *FROM VotiWHERE MatricolaNOT LIKE ‘%2’
Esempi di query
DEMO
SQLite - Introduzione
• Database open-source adottato da Google, Apple e Microsoft
• SQLite è leggero, veloce e facilmente trasportabile• Il database viene memorizzato in un singolo file
Pagina ufficiale del progetto: http://sqlite.org/
SQLite - Limitazioni
• Alcuni tipi di sintassi avanzate non sono supportati (per esempio il tipo di dato “Long”)
• Gli unici comandi disponibili per alterare le tabelle sono RENAME e ADDCOLUMN
• Le “Viste” sono accessibili solo in lettura
Per tutte le altre limitazioni:http://sqlite.org/limits.html
SQLite – Creazione del Database in una PCL Xamarin.Forms
Prima di tutto, bisogna aggiungere il pacchetto NuGet ad ogni progetto della soluzione:
https://www.nuget.org/packages/sqlite-net-pcl/
SQLite – Creazione della tabella
La tabella in SQLite viene gestita da una classe (NomeTabella.cs).
public class Person{ [PrimaryKey, AutoIncrement] public int ID { get; }
public string FirstName { get; set; }
public string LastName { get; set; }
[MaxLength(3)] public int Age { get; set; }}
SQLite – Override dei metodi di default
E’ possibile fare un override dei metodi di default, proprio come in C#, sulle tabelle usate:
public class Person{
[...]public override string ToString()
{ return string.Format("[Person: ID={0}, FirstName={1}, LastName={2}]", ID, FirstName, LastName); }}
SQLite – Colleghiamoci al Database (Portable)
public interface ISQLite { SQLiteConnection GetConnection();}
Bisogna creare un file di interfaccia da estendere poi per ogni piattaforma:
E ora vediamo come implementare l’interfaccia su ogni piattaforma!
SQLite – Colleghiamoci al Database (iOS)
[assembly: Dependency (typeof (SQLite_iOS))]
public class SQLite_iOS : ISQLite {public SQLite_iOS () {}public SQLite.SQLiteConnection GetConnection (){ var sqliteFilename = "TodoSQLite.db3"; string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); string libraryPath = Path.Combine (documentsPath, "..", "Library"); // Library folder var path = Path.Combine(libraryPath, sqliteFilename); // Create the connection var conn = new SQLite.SQLiteConnection(path); // Return the database connection return conn;}}
SQLite – Colleghiamoci al Database (Android)
[assembly: Dependency (typeof (SQLite_Android))]
public class SQLite_Android : ISQLite {public SQLite_Android () {}public SQLite.SQLiteConnection GetConnection () { var sqliteFilename = "TodoSQLite.db3"; string documentsPath = System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal); var path = Path.Combine(documentsPath, sqliteFilename); // Create the connection var conn = new SQLite.SQLiteConnection(path); // Return the database connection return conn;}}
SQLite – Colleghiamoci al Database (Windows Phone)
[assembly: Dependency (typeof (SQLite_WinPhone))]
public class SQLite_WinPhone : ISQLite{public SQLite_WinPhone () {}public SQLite.SQLiteConnection GetConnection (){ var sqliteFilename = "TodoSQLite.db3"; string path = Path.Combine(ApplicationData.Current.LocalFolder.Path, sqliteFilename); // Create the connection var conn = new SQLite.SQLiteConnection(path); // Return the database connection return conn;}}
SQLite – Connessione e Creazione prima tabella
SQLiteConnection database = DependencyService.Get<ISQLite> ().GetConnection ();
database.CreateTable<Person>();
Ora finalmente potremo collegarci al Database:
E creare la prima tabella, con la struttura Person definite prima:
SQLite – Intereragire con i dati nel database
database.Query<Person>("SELECT * FROM [Person] WHERE [Done] = 0");
Query diretta in SQL nel Database appena creato:
(from i in database.Table< Person>() select i).ToList();
database.Table< Person>().FirstOrDefault(x => x.ID == id);
database.Delete< Person>(id);
Approccio offerto da SQLite.NET
Implementiamo SQLite
DEMO
SQLite – Più informazioni su SQLite in Xamarin
Qui, oltre a rivedere quanto visto nella Demo, è possibile imparare come si implementa SQLite anche in un progetto Shared:
http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/databases/
Grazie per l’attenzione
Guido MagrinXamarin Student Ambassador
@GuidoMagrin