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

Leave a reply