Mangiare Senza Glutine disponibile su App Store

Per altre informazioni scrivi a fabriziocaldarelli@negusweb.it

SQLite Client per Windows Phone

Da Programmazione Software.

Questo client usa la libreria Sqlite Client for Windows Phone (http://sqlitewindowsphone.codeplex.com/releases) rel 2 v.0.6.1 con un pò di modifiche.

Ho scritto una classe DatabaseWrapper ( nella cartella Classes ) che include alcune operazioni del db come la copia dal progetto all'isolated storage.

Prestare attenzione al fatto che viene creato un file con lo stesso nome del database con in più il suffisso -journal, altrimenti le librerie vanno in eccezione.


Modifiche alla libreria di base

Aggiunto il supporto alle colonne di tipo DateTime con valori null

    public DateTime ToDateTime(string dateText)
    {
        switch (dateFormat)
        {
            case SQLiteDateFormats.Ticks:
                return new DateTime(Convert.ToInt64(dateText, CultureInfo.InvariantCulture));
            case SQLiteDateFormats.JulianDay:
                return ToDateTime(Convert.ToDouble(dateText, CultureInfo.InvariantCulture));
            default:
                {
                    if (dateText != null)
                    {
                        return DateTime.ParseExact(dateText, _datetimeFormats, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None);
                    }
                    else
                    {
                        return DateTime.MinValue;
                    }
                }
        }
    }

Aggiungere funzioni personalizzate, come il calcolo della distanza tra due posizioni gps

Nel database wrapper, quando apri il database aggiungo la funziona personalizzata:

        private void Open()
        {
            db.Open();
            Sqlite3.sqlite3_create_function(db.SqliteDb, "distanceGPSInKM", 4, Sqlite3.SQLITE_UTF8, null, SQLite_distanceGPSFunc, null, null);
        }

Definisco nel database wrapper il metodo statico SQLite_distanceGPSFunc

        public static void SQLite_distanceGPSFunc(
            Sqlite3.sqlite3_context ctx, int argc, Sqlite3.Mem[] argv
        )
        {
            // check that all four arguments are non-null
            if (Sqlite3.sqlite3_value_type(argv[0]) == Sqlite3.SQLITE_NULL || Sqlite3.sqlite3_value_type(argv[1]) == Sqlite3.SQLITE_NULL || Sqlite3.sqlite3_value_type(argv[2]) == Sqlite3.SQLITE_NULL || Sqlite3.sqlite3_value_type(argv[3]) == Sqlite3.SQLITE_NULL)
            {
                Sqlite3.sqlite3_result_null(ctx);
                return;
            }
            // get the four argument values
            double lat1 = Sqlite3.sqlite3_value_double(argv[0]);
            double lon1 = Sqlite3.sqlite3_value_double(argv[1]);
            double lat2 = Sqlite3.sqlite3_value_double(argv[2]);
            double lon2 = Sqlite3.sqlite3_value_double(argv[3]);
            // convert lat1 and lat2 into radians now, to avoid doing it twice below
            double lat1rad = DEG2RAD(lat1);
            double lat2rad = DEG2RAD(lat2);
            // apply the spherical law of cosines to our latitudes and longitudes, and set the result appropriately
            // 6378.1 is the approximate radius of the earth in kilometres
            Sqlite3.sqlite3_result_double(ctx, Math.Acos(Math.Sin(lat1rad) * Math.Sin(lat2rad) + Math.Cos(lat1rad) * Math.Cos(lat2rad) * Math.Cos(DEG2RAD(lon2) - DEG2RAD(lon1))) * 6378.1);
 
        }


Riferimenti