Results for tag "sqlite"

WP8 – Verwenden von SQLite

Hallo Leute,

nachdem Ihr SQLite erfolgreich eingerichtet habt (siehe meinen Blog-Eintrag ), zeige ich euch hier, wie man SQLite im WP8-Projekt selbst verwendet, Tabellen erstellt, usw.

DB Connection einrichten

Am einfachsten geht’s wenn man in der App.xaml.cs die Initialisierung vornimmt, am besten im Konstruktor, unterhalb der üblichen Initialize-Methoden.


/// <summary>
        /// Constructor for the Application object.
        /// </summary>
        public App()
        {
            // Global handler for uncaught exceptions.
            UnhandledException += Application_UnhandledException;

            // Standard XAML initialization
            InitializeComponent();

            // Phone-specific initialization
            InitializePhoneApplication();

            // Language display initialization
            InitializeLanguage();

            AppSettings = new AppSettings();

            // Show graphics profiling information while debugging.
            if (Debugger.IsAttached)
            {
                // Display the current frame rate counters.
                Application.Current.Host.Settings.EnableFrameRateCounter = false;

                // Show the areas of the app that are being redrawn in each frame.
                //Application.Current.Host.Settings.EnableRedrawRegions = true;

                // Enable non-production analysis visualization mode,
                // which shows areas of a page that are handed off GPU with a colored overlay.
                //Application.Current.Host.Settings.EnableCacheVisualization = true;

                // Prevent the screen from turning off while under the debugger by disabling
                // the application's idle detection.
                // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run
                // and consume battery power when the user is not using the phone.
                PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
            }

            InitDatabase();
        }

        public static SQLiteConnection DbConnection { get; set; }
        public static string DbPath = Path.Combine(Path.Combine(ApplicationData.Current.LocalFolder.Path, "db.sqlite"));

        public void InitDatabase()
        {
            // establish connection
            DbConnection = new SQLiteConnection(DbPath);
               
        }

Das File (db.sqlite) wird beim erstmaligen Aufruf automatisch erzeugt. Damit haben wir nun eine leere Datenbank erstellt.
Nun gehts an das Erzeugen von Tabellen.

Tabellen erstellen
Tabellen werden an Hand von Klassen erzeugt. Die Eigenschaften der Klasse werden dann mit Attributen versehen, welche z.B. Angaben über AutoIncrement oder Primärschlüssel machen oder SQlite mitteilen, dass eine Eigenschaft ignoriert werden soll (z.B. für logische Properties).

public class Profile : INotifyPropertyChanged
    {
        private int _id = -1;
        /// <summary>
        /// You can create an integer primary key and let the SQLite control it.
        /// </summary>
        [PrimaryKey, AutoIncrement]
        public int Id
        {
            get
            {
                return _id;
            }
            set
            {
                if (value != _id)
                {
                    _id = value;
                    NotifyPropertyChanged("ID");
                }
            }
        }

        private string _userName;
        /// <summary>
        /// Sample VacationViewModel property; this property is used in the view to display its value using a Binding.
        /// </summary>
        /// <returns></returns>
        public string UserName
        {
            get
            {
                return _userName;
            }
            set
            {
                if (value != _userName)
                {
                    _userName = value;
                    NotifyPropertyChanged("UserName");
                }
            }
        }

/// <summary>
        /// Gets the color of the state.
        /// </summary>
        /// <value>
        /// The color of the state.
        /// </value>
        [SQLite.Ignore]
        public System.Windows.Media.Brush StateColor
        {
            get
            {
                switch (this.State)
                {
                    case "genehmigt":
                        return new SolidColorBrush(Colors.Green);

                    case "abgelehnt":
                        return new SolidColorBrush(Colors.Red);

                    default:
                        return new SolidColorBrush(Colors.Yellow);
                }
            }
            set
            {
                // ignore
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
}

Wie Ihr seht, leite ich von INotifyPropertyChanged ab. Das hat nichts mit SQLite zu tun, sondern mit MVVM, man kann die Klasse also gleich direkt weiterverwenden und muss kein eigenes ViewModel erzeugen… Aber das ist jetzt nicht Teil des Blogeintrags. Interessanter sind die Attribute PrimaryKey, AutoIncrement und SQLite.Ignore, welche selbsterklärend sind.

Hat man diese Klasse fertig, kann man eine Tabelle erzeugen lassen.

            // establish connection
            DbConnection = new SQLiteConnection(DbPath);

            //DbConnection.DropTable<Vacation>();
            // create table if not exists
            DbConnection.CreateTable<Vacation>()

Datensätze hinzufügen

Nun kann man ganz einfach Datensätze erzeugen. Demonstrieren möchte ich euch das am Beispiel von Dummy-Daten, welche man z.B. zum Testen und erstmaligen Launch einer App hinzufügen kann:


public void InitDatabase()
        {
            // establish connection
            DbConnection = new SQLiteConnection(DbPath);

            // create table if not exists
            //DbConnection.DropTable<Profile>();
            DbConnection.CreateTable<Profile>();

            for (int i = 0; i <= 50; i;)
            {
                var profile = new Profile();
                profile .UserName = @"username";
                DbConnection.Insert(profile );
            }
        }

Cheers,
Christian

WP8 – Einbinden von SQLite – Projekt aufsetzen

Hallo Leute,

heute möchte ich euch zeigen, wie Ihr SQLite in WP8 verwenden könnt. Vielen Dank an Nokia für den hervorragenden WIKI-Eintrag: .

Als ersten Schritt ist es notwendig die Extension „SQLite for Windows Phone“ zu installieren. Das Geht über TOOLS -> Extensions and Updates -> online -> Suche nach „sqlite“. Dann solltet Ihr folgendes Bild bekommen:

Extensions-and-update-window-1.png

Dieses Paket muss installiert werden, am Ende sollte folgendes Bild rauskommen:

 

Extensions-and-update-window-2.png
Zusätzlich benötigt es „leider“ eine C++ – Bridge zwischen dem SQLite SDK und sqlite-net. Am einfachsten lädt man sich dieses Projekt von herunter.
Dieses Projekt muss man nun seiner Visual Studio Solution hinzufügen und eine Referenz in das eigene WP8-Projekt hinzufügen. Alternativ kann man natürlich das GIT-Projekt einfach kompilieren und lediglich die DLL referenzieren.

Als letzten Schritt muss nur noch via NuGet das sqlite-net Package eingebunden werden. Dazu klickt einfach euer WP8-Projekt im Solution Fenster mit der rechten Maustaste an und klickt auf „Manage NuGet Packages“.

Adding-sqlite-for-wp8-support.png

 

Es gibt nun zwei Probleme, welche potentiell auftreten können. In meinem ersten Gehversuch sind beide aufgetreten, hier die Lösung:

1.) „The type or namespace ‚Community‘ could not be found.
Das ist relativ simple zu lösen, indem man einfach ein Build-Symbol hinzufügt: USE_WP8_NATIVE_SQLITE

2013-11-21 15_58_44-at.wienit.vacation.solution (Running) - Microsoft Visual Studio (Administrator)

2.) „Any CPU“ problem

Warning-message-any-cpu.png

Auch das geht recht einfach, man muss, wenn man den Emulator verwendet x86 umstellen (Solution -> Click on Configuration Properties -> Configuration Manager), wenn man am Device testen möchte auf ARM.

Cheers,
Christian