Proviamo a creare un'applicazione cross platform utilizzando Xamarin in Visual Studio. Abbiamo bisogno di aggiungere il supporto sqlite per android, ios e windows phone all'interno del nostro progetto Pcl. Abbiamo aggiunto PCL Sqlite-Net tramite NuGet, ma non c'era nessuno di SQLiteDataReader, SQLiteParameter o SQLiteDataAdapter. C'è un modo per creare un Pcl con supporto mono.data.sqlite per tutte e tre le piattaforme?Come creare un PCL con supporto sqlite in un'applicazione xamarin cross platform
risposta
Xamarin ha un esempio decente di un programma chiamato Tasky che utilizza SQLite e PCL: http://docs.xamarin.com/guides/cross-platform/application_fundamentals/pcl/introduction_to_portable_class_libraries/
Ecco un estratto di pertinenza di SQLite e PCL:
Il Portable libreria di classi è limitato in .NET funzionalità che può supportare. Poiché è compilato per l'esecuzione su più piattaforme, non può utilizzare la funzionalità [DllImport] utilizzata in SQLite-NET. Invece SQLite-NET è implementato come una classe astratta e quindi referenziato attraverso il resto del codice condiviso. Un estratto delle API astratta è la seguente:
public abstract class SQLiteConnection : IDisposable {
public string DatabasePath { get; private set; }
public bool TimeExecution { get; set; }
public bool Trace { get; set; }
public SQLiteConnection(string databasePath) {
DatabasePath = databasePath;
}
public abstract int CreateTable<T>();
public abstract SQLiteCommand CreateCommand(string cmdText, params object[] ps);
public abstract int Execute(string query, params object[] args);
public abstract List<T> Query<T>(string query, params object[] args) where T : new();
public abstract TableQuery<T> Table<T>() where T : new();
public abstract T Get<T>(object pk) where T : new();
public bool IsInTransaction { get; protected set; }
public abstract void BeginTransaction();
public abstract void Rollback();
public abstract void Commit();
public abstract void RunInTransaction(Action action);
public abstract int Insert(object obj);
public abstract int Update(object obj);
public abstract int Delete<T>(T obj);
public void Dispose()
{
Close();
}
public abstract void Close();
}
Il resto del codice condiviso utilizza la classe astratta di “store” e “recuperare” oggetti dal database. In qualsiasi applicazione che utilizza questa classe astratta, è necessario passare a un'implementazione completa che fornisca le funzionalità effettive del database.