none
[Résolu]Comment utiliser une base SQLite existante pour UWP (Windows phone)? RRS feed

  • Question

  • Bonjour,

    Après quelques années en mode web, je reviens (difficilement) dans le monde du C# et plus spécifiquement coté Windows Phone.
    Mon problème réside dans l’implémentation du code pour intégrer une base SQLIte existante.

    Le projet est en C#, pour Windows Phone 10. (Utilisation de Visual Studio 2017)

    Malgré mes nombreuse recherche sur le Net, je n'arrive pas à intégrer/compiler ma base SQLite existante sur le téléphone.
    J'ai essayé de m'appuyer sur cet exemple:

    http://blog.qmatteoq.com/import-an-already-existing-sqlite-database-in-a-windows-8-application/

    Mais où mettre ce code? Quels using implémenter? 

    A noter que j'ai bien importé les packages SQLIte via Nugets.

    D'ailleurs la création d'une base locale depuis le téléphone, fonctionne bine.

    Help et merci...



    • Modifié EVonZ mercredi 5 juillet 2017 08:14
    lundi 3 juillet 2017 07:58

Réponses


  • Mon problème réside dans l'exportation sur le device d'une base SQLite existante.

    Mon appli fonctionne parfaitement en mode X64/debug, mais dès que je passe sur le téléphone, la base reste vide...

    Je ne vois pas d'où provient le problème....

    Néanmoins je garde sous le coude votre article sur EF et SQLIte.

    Dans ce cas c'est normal que cela ne fonctionne pas sur le téléphone Windows Phone.

    Vous avez donc 2 possibilités : 

    Copier la base de données SQLite dans le répertoire Assets

    Dans ce cas vous devez mettre la base de données dans votre répertoire Asset de la solution et y appliquer les propriétés suivantes dans le fichier SQLite : 

    • Build Action = Content
    • Copy to output Directory= Copy if newer

    Voir PJ (ci-dessous) pour une capture d'écran

    Attention à bien modifier le chemin d'accès à votre base de données.

    Générer une nouvelle base de données à l'exécution

    Créer la base de données lors du premier démarrage de l'application, il faudra donc prévoir une méthode d'insertion des données initiales juste après sa création.

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;



    lundi 3 juillet 2017 12:23
  • Vu que dans votre cas la base de données est créée dans votre application en mode debug, voici ce lien qui vous explique la bonne démarche (étape par étape) adaptée à votre contexte : https://stackoverflow.com/questions/35229172/referencing-and-reading-from-a-sqlite-database-file-c-uwp

    La seule modification à faire c'est d'appliquer ces propriétés à la base de données :

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;


    lundi 3 juillet 2017 14:34
  • Peut-être avez fait une mise à jour de votre version d'SQLite.

    Voici des pistes :

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;

    mardi 4 juillet 2017 19:53
  • Bon ça y est!!!! Pfffffff

    using System;
    using System.IO;
    using System.Linq;
    using Windows.UI.Popups;
    using Windows.UI.Xaml.Controls;
    
    // Pour plus d'informations sur le modèle d'élément Page vierge, consultez la page https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
    
    namespace SQLiteUWPExist
    {
        /// <summary>
        /// Une page vide peut être utilisée seule ou constituer une page de destination au sein d'un frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
                Database cnxSQ = new Database();
                
               
            }
            public class Database
            {
                string path;
                SQLite.Net.SQLiteConnection conn;
    
                public Database()
                {
                    path = Path.Combine(Windows.ApplicationModel.Package.Current.InstalledLocation.Path, "Assets", "dbuwp.sqlite");
                    conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), path);
                    conn.CreateTable<users>();
                    var query = from m in conn.Table<users>() orderby m.id descending select m;
    
                    var s = query.Aggregate("", (current, users) => current + (users.id + " " + users.name + Environment.NewLine));
    
                    new MessageDialog(s).ShowAsync();
    
                }
            }
        }
    }

    puis la classe

    using SQLite.Net.Attributes;
    
    namespace SQLiteUWPExist
    {
        public class users
        {
           
                [PrimaryKey, AutoIncrement]
                public int id { get; set; }
    
                [MaxLength(30)]
                public string name { get; set; }
    
                [MaxLength(30)]
                public string nickname { get; set; }
    
                public int codepostal { get; set; }
    
    
        }
    }
    Sans oublier le Microsoft.Data.SQLite via Nugets 
    J'ai importé ma base dans le répertoire Assets, et modifié les 2 premières propriétés de 'Avancés' en: Contenu et Copier si plus récent

    Et le tout est joué!!!

    x86, x64 + Device OK

    Merci encore de ton aide...

    mardi 4 juillet 2017 20:58

Toutes les réponses

  •  string path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path,
                         "maBase.sqlite");
                    conn = new SQLite.Net.SQLiteConnection(new
                       SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), path);
    Où mettre ceci?
    using (conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), path))
                {
                    var result = conn.Query<ObjectModel>(@"Select * From TableName");
                }
    et ce code? Je ne comprends pas l'implémentation.

    • Modifié EVonZ lundi 3 juillet 2017 09:00
    lundi 3 juillet 2017 09:00
  • Bonjour EVonZ,

    Je vous suggère d'utiliser cet article qui correspond à l'utilisation d'une base de données SQLite sur une application UWP. Il est plus simple et mieux détaillé : Using SQLite databases in UWP apps

    J'ai également rédigé un article à ce sujet dans mon blog en utilisant un ORM Entity Framework Core : Entity Framework Core et SQLite dans une application Universelle Windows

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;

    lundi 3 juillet 2017 10:03
  • Bonjour Nourdine,

    En fait j'arrive sans problème à gérer une base créée sur le device WP 10.

    Mon problème réside dans l'exportation sur le device d'une base SQLite existante.

    Mon appli fonctionne parfaitement en mode X64/debug, mais dès que je passe sur le téléphone, la base reste vide...

    Je ne vois pas d'où provient le problème....

    Néanmoins je garde sous le coude votre article sur EF et SQLIte.

    lundi 3 juillet 2017 11:31

  • Mon problème réside dans l'exportation sur le device d'une base SQLite existante.

    Mon appli fonctionne parfaitement en mode X64/debug, mais dès que je passe sur le téléphone, la base reste vide...

    Je ne vois pas d'où provient le problème....

    Néanmoins je garde sous le coude votre article sur EF et SQLIte.

    Dans ce cas c'est normal que cela ne fonctionne pas sur le téléphone Windows Phone.

    Vous avez donc 2 possibilités : 

    Copier la base de données SQLite dans le répertoire Assets

    Dans ce cas vous devez mettre la base de données dans votre répertoire Asset de la solution et y appliquer les propriétés suivantes dans le fichier SQLite : 

    • Build Action = Content
    • Copy to output Directory= Copy if newer

    Voir PJ (ci-dessous) pour une capture d'écran

    Attention à bien modifier le chemin d'accès à votre base de données.

    Générer une nouvelle base de données à l'exécution

    Créer la base de données lors du premier démarrage de l'application, il faudra donc prévoir une méthode d'insertion des données initiales juste après sa création.

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;



    lundi 3 juillet 2017 12:23
  • Merci.

    Le cas qui m’intéresse est: Copier la base de données SQLite dans le répertoire Assets

    J'ai bien paramétré les propriété de maBase.SQLite, et celle-ci est bien dans le répertoire Assets

    Mais le résultat est toujours le même...

    Qu'entendez-vous par: Attention à bien modifier le chemin d'accès à votre base de données. ???
    Je dois intégrer le répertoire Assets comme ça?

    string path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path,"Assets/maBase.sqlite");


    • Modifié EVonZ lundi 3 juillet 2017 13:20
    lundi 3 juillet 2017 13:09
  • Vu que dans votre cas la base de données est créée dans votre application en mode debug, voici ce lien qui vous explique la bonne démarche (étape par étape) adaptée à votre contexte : https://stackoverflow.com/questions/35229172/referencing-and-reading-from-a-sqlite-database-file-c-uwp

    La seule modification à faire c'est d'appliquer ces propriétés à la base de données :

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;


    lundi 3 juillet 2017 14:34
  • Merci pour tous ces renseignements, malheureusement je rame et Visual Studio 2017 fait des siennes!!

    Erreur: CS5001  C# Le programme ne contient pas de méthode 'Main' statique adaptée à un point.....

    Depuis une heure, j'arrive pas à m'en dépêtrer...
    • Modifié EVonZ lundi 3 juillet 2017 20:07
    lundi 3 juillet 2017 20:06
  • ET là j'ai une erreur:

    System.EntryPointNotFoundException : 'Unable to find an entry point named 'sqlite3_win32_set_directory' in DLL 'sqlite3'.'

    Ce même programme fonctionnait ce matin, et là rien du tout!!

    Si quelqu'un a une solution, je prends de suite!! :-(

    lundi 3 juillet 2017 20:16
  • Peut-être avez fait une mise à jour de votre version d'SQLite.

    Voici des pistes :

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;

    mardi 4 juillet 2017 19:53
  • Franchement, c'est plus facile sous Android ou IOs!!

    J'ai installé Microsoft.Data.SQLite via Nugets...l'erreur n'est plus la même:
    SQLite.Net.SQLiteException : 'Could not open database file: c:\users\stéphane\documents\visual studio 2017\Projects\SQLiteUWPExist\SQLiteUWPExist\bin\x86\Debug\AppX\Assets\dbuwp.sqlite (CannotOpen)'

    Je ne sais pas quel 'using' utiliser, ni où mettre le code (MainPage.xaml.cs ou bien App.xaml.cs) ???

    En gros c'est la galère!!! :-(

    J'ai même réinstallé VS 2017....

    mardi 4 juillet 2017 20:49
  • Bon ça y est!!!! Pfffffff

    using System;
    using System.IO;
    using System.Linq;
    using Windows.UI.Popups;
    using Windows.UI.Xaml.Controls;
    
    // Pour plus d'informations sur le modèle d'élément Page vierge, consultez la page https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
    
    namespace SQLiteUWPExist
    {
        /// <summary>
        /// Une page vide peut être utilisée seule ou constituer une page de destination au sein d'un frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
                Database cnxSQ = new Database();
                
               
            }
            public class Database
            {
                string path;
                SQLite.Net.SQLiteConnection conn;
    
                public Database()
                {
                    path = Path.Combine(Windows.ApplicationModel.Package.Current.InstalledLocation.Path, "Assets", "dbuwp.sqlite");
                    conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), path);
                    conn.CreateTable<users>();
                    var query = from m in conn.Table<users>() orderby m.id descending select m;
    
                    var s = query.Aggregate("", (current, users) => current + (users.id + " " + users.name + Environment.NewLine));
    
                    new MessageDialog(s).ShowAsync();
    
                }
            }
        }
    }

    puis la classe

    using SQLite.Net.Attributes;
    
    namespace SQLiteUWPExist
    {
        public class users
        {
           
                [PrimaryKey, AutoIncrement]
                public int id { get; set; }
    
                [MaxLength(30)]
                public string name { get; set; }
    
                [MaxLength(30)]
                public string nickname { get; set; }
    
                public int codepostal { get; set; }
    
    
        }
    }
    Sans oublier le Microsoft.Data.SQLite via Nugets 
    J'ai importé ma base dans le répertoire Assets, et modifié les 2 premières propriétés de 'Avancés' en: Contenu et Copier si plus récent

    Et le tout est joué!!!

    x86, x64 + Device OK

    Merci encore de ton aide...

    mardi 4 juillet 2017 20:58
  • Je pense qu'il serait mieux que vous partagez tout le code (via OneDrive) de votre application.

    Cela permettrait de trouver une réponse définitive et de clore votre post.

    Merci


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;


    mardi 4 juillet 2017 21:13
  • Bon, la lecture fonctionne bien, mais il m'est impossible d’utiliser le insert!!
     public void Insert(users objContact)
            {
                var sqlpath = System.IO.Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "dbuwp.sqlite");
                using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), sqlpath))
                {
                    conn.RunInTransaction(() => { conn.Insert(objContact); });
                }
            }

    Si quelqu'un voit le problème...
    jeudi 6 juillet 2017 21:03