Dorian LAMANDE & Technologies Microsoft

Portable Class Library (UPDATE)

Posted by Dorian LAMANDE sur juillet 17, 2014

Dans ce billet https://dorianlamande.wordpress.com/2012/10/31/portable-class-library/, j’expliquais comment récupérer un flux JSON dans une PCL que l’on pourra utiliser dans un projet Windows Phone / Windows 8 ou encore avec Xamarin.

Ce code fonctionne mais n’est pas très pratique. Depuis Microsoft a sortie “Microsoft HTTP Client Libraries”. Et là faut le dire c’est top. C’est encore en beta. Mais ca marche très bien 🙂

Vous pouvez le coupler avec “Microsft Async” pour bénéficier de “await / async”.

Pour les ajouter à votre projet, il suffit d’installer les packages NuGet du même nom.

Ensuite pour une requête Get on fera comme ceci :

HttpClient httpClient = new HttpClient();
return await httpClient.GetStringAsync(u.Uri);

Et pour une requête Post :

HttpClient httpClient = new HttpClient(); 
StringContent sc = new StringContent(postData, Encoding.UTF8, contentType);
HttpResponseMessage response = await httpClient.PostAsync(u.Uri, sc);
return await response.Content.ReadAsStringAsync();

C’est quand même plus sympa.

Posted in Portable Class Library | Tagué: , , , , | Leave a Comment »

[XAMARIN] : SQLite et PCL (Portable Class Library)

Posted by Dorian LAMANDE sur mai 30, 2014

Cela faisait longtemps que je n’avais pas publié quelque chose ! Alors aujourd’hui je vous propose de voir comment utiliser SQLite via une PCL le tout mixé avec XAMARIN pour ensuite pouvoir utiliser SQLite sur Android 🙂 J’en ai perdu combien là ?

Tout d’abord on va utiliser notre IDE préféré Visual Studio 2013. Ca marche aussi avec 2012 mais pour 2012 vous aurez sûrement besoin de ceci (pour éviter un File Not Found)

 SQLite-For-WP8-Install-Step-1

Il s’agit d’une extension visual studio (disponible dans Tools > Extentions and Updates)

Nous allons maintenant créer notre projet dans un solution blanche (ex : SQLite.PCL, ok y’a mieux).

Projet Portable Class Libray

Ajoutons notre projet “Portable Class Library” SQLite.PCL.

Supprimer le fichier MyClass.

On va créer un dosier DAL (Data Access Layer) avec un fichier DataBaseAcces.cs : ce fichier contiendra notre accès à notre base de données et les différentes méthodes pour ajouter supprimer … des données.

On va créer un dossier “Model” dans lequel on ajoutera un fichier Stock.cs.

Pour pouvoir utiliser SQLite il faudra ajouter le package NuGet suivant :

image

Maintenant on va pouvoir commencer à coder 🙂

D’abord notre model :

[Table("Items")]

public class Stock {

   [PrimaryKey, AutoIncrement, Column("_id")]

   public int Id { get; set; }

   [MaxLength(8)]

   public string Symbol { get; set; }

}

J’ai juste repris ce qu’il y avait sur la doc nokia dev (http://developer.xamarin.com/guides/cross-platform/application_fundamentals/data/part_3_using_sqlite_orm/)

En fait on aura une table Items ici représentée par notre class Stock.

Ensuite notre DataBaseAccess.cs :

Ici on va faire quelque chose de simple, le but de ce billet est simplement de montrer la création d’une bdd Sqlite et son accès.

 

private SQLiteConnection _db; 

        public DataBaseAccess()

        {

        }

        public void CreateDataBase(ISQLitePlatform plateform, string dbPath)

        {

            _db = new SQLiteConnection(plateform, dbPath);

            _db.CreateTable<Stock>();

            _db.Insert(new Stock { Symbol = "Test" });

            _db.Commit();

        }

        public TableQuery<Stock> GetDataStock()

        {

            return _db.Table<Stock>();

        }

 

Voilà notre PCL est prête.

Client Windows Phone 8

Pour notre client Windows Phone 8, on va devoir ajouter un nouveau projet, référencer notre PCL et ajouter les packages NuGet suivants :

image

Vous devrez aussi avoir du x86 en plateforme pour le simulateur ou ARM pour votre device. Le any cpu n’étant pas supporté.

string dbPath = Path.Combine(Path.Combine(ApplicationData.Current.LocalFolder.Path, "sample.sqlite"));

DataBaseAccess dbAccess = new DataBaseAccess();

dbAccess.CreateDataBase(new SQLitePlatformWP8(), dbPath);

var items = dbAccess.GetDataStock();

Une erreur File Not Found peut apparaître lors de déploiement, pour cela il faut ajouter la référence qui provient de l’extension 🙂image

Ou éditez le csprojet et ajoutez ceci :

<ItemGroup>
    <SDKReference Include="SQLite.WP80, Version=3.8.4.3">
      <Name>SQLite for Windows Phone</Name>
    </SDKReference>
</ItemGroup>

Maintenant si tout se passe bien vous devriez avoir du monde dans “items”.

 

Client Android (Xamarin)

Pour Androïd ce sera quasiment la même chose. On ajoute notre projet, on référence notre PCL et on ajoute les packages NuGet suivants :

image

string dbPath = Path.Combine (

                System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal),

                "sample.sqlite");

 DataBaseAccess dbAccess = new DataBaseAccess ();

dbAccess.CreateDataBase (new SQLitePlatformAndroid (), dbPath);

 var items = dbAccess.GetDataStock ();

Si tout se passe bien vous devriez avoir du monde dans “items”.

On aura pu mettre le nom du fichier dans notre PCL et simplement indiquer le folder suivant la plateforme et gérer un close lorsque l’on a terminé nos transactions.

J’espère que ce billet vous aura aider dans la mise en place de SQLite sur vos plateformes mobiles.

A bientôt.

Posted in Android, Windows Phone 8, Xamarin | Tagué: , , , | Leave a Comment »

Brancher votre SQL Azure avec Azure Mobile Services

Posted by Dorian LAMANDE sur juillet 2, 2013

1. Créer une base de données SQL

SQLDb

J’ai repris notre base de données préférée : “Northwind”. Le script est dispo ici

http://nwindazure.codeplex.com/SourceControl/changeset/view/28806#445285

 

2. Créer un nouveau Azure Mobile Service

image

N’oubliez pas de mettre dans “BASE DE DONNEES” : utiliser une base existante.

Nous avons maintenant une base de données ainsi qu’un service mobile.

 

3. Ouvrir SQL Server Management Studio 2012

image

Ouvrez le script “ Northwind_edited_for_SQLAzure”.

On se contentera pour le moment de ne prendre que la partie Customer.

Remplacer “dbo” par le nom du service mobile que vous venez de créer (pour moi c’est demoNorthWind).

Remplacer également [CustomerId] par [id] pour que cela soit supporter par le Service.

CREATE TABLE [demoNorthwind].[Customers] (
    [id]   NCHAR (5)     NOT NULL,
    [CompanyName]  NVARCHAR (40) NOT NULL,
    [ContactName]  NVARCHAR (30) NULL,
    [ContactTitle] NVARCHAR (30) NULL,
    [Address]      NVARCHAR (60) NULL,
    [City]         NVARCHAR (15) NULL,
    [Region]       NVARCHAR (15) NULL,
    [PostalCode]   NVARCHAR (10) NULL,
    [Country]      NVARCHAR (15) NULL,
    [Phone]        NVARCHAR (24) NULL,
    [Fax]          NVARCHAR (24) NULL
);

 

Notre table est maintenant créée vous pouvez jouer le script d’insert pour y ajouter de la donnée.

4. Ajout de la table dans Azure Mobile Services

image

Ajouter une table nommée “Customers”

Nous allons générer notre application HTML5/JS

image

 

5. Modification de l’application HTML5/JS

Editez le fichier page.js

todoItemTable = client.getTable('Customers');
.append($('<div>').append($('<input class="item-text">').val(item.ContactName)));

Lancer le server et aller sur http://localhost:8000.

Normalement vous devriez avoir des données Smile

 

Vous avez donc très facilement accès à votre DataBase au travers de Mobile Services.

Posted in Windows Azure | Tagué: | Leave a Comment »

Portable Class Library

Posted by Dorian LAMANDE sur octobre 31, 2012

Cela faisait bien longtemps que je n’avais publié de billet.

Depuis quelques mois je bosse sur Windows 8 et là je suis ammené à faire des applications pour Windows Phone 8 / 7.5.

Je me suis dit : “Ce serait quand même dommage de ne pas réutiliser du code métier pour l’application Windows Phone”.

En effet, ce serait dommage car la “Portable Class Library” est là pour ça !

Ce qui m’intéressait c’était surtout de récuperer la couche d’accès aux services. J’avais développé cette couche avec async / await / HttpClient, qui ne sont pas supportés dans la “Portable Class Library” 😦 . Du coup, j’ai refait au propre ma library (j’en ai profité pour virer le spécifique WinRT).

Ca y est ça compile ! Je run sur Windows 8 : ça passe !

Passons sur Windows Phone 8.

J’ajoute ma référence à mon projet WP8, ça compile, mais là pas moyen d’avoir mes données ! Analysons :

Dans ma “Portable Class Library” :

public class RequestState
{
   const int BUFFER_SIZE = 1024;
   public StringBuilder requestData;
   public byte[] BufferRead;
   public HttpWebRequest MyHttpWebRequest;
   public HttpWebResponse response;
   public Stream streamResponse;
   public RequestState()
   {
            BufferRead = new byte[BUFFER_SIZE];
            requestData = new StringBuilder("");
            MyHttpWebRequest = null;
            streamResponse = null;
   }
}
private static ManualResetEvent allDone = new ManualResetEvent(false);
public string GetFlux(string url)
{

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    req.Accept = "application/json";


    req.Method = "GET";

    // Création de l'objet état
    RequestState rs = new RequestState();
    //On ajoute la requete dans l'objet état pour pouvoir le récupérer dans la callback
    rs.MyHttpWebRequest = req;

    //Appel asynchrone

    IAsyncResult response = req.BeginGetResponse(result =>
    {
      //Récupération de l'objet etat 
      RequestState state = (RequestState)result.AsyncState;

      //Récupération de la requete web (object HttpWebRequest)
      HttpWebRequest request = rs.MyHttpWebRequest;

      //Récupération de la réponse Web
      HttpWebResponse resp = (HttpWebResponse)request.EndGetResponse(result);

      Stream responseStream = resp.GetResponseStream();
      StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
      _reponseContent = sr.ReadToEnd();
      responseStream.Dispose();

                
        allDone.Set();
       }, rs);

    allDone.WaitOne();

    return this._reponseContent;

}

Sur Windows 8 :

string content = (newService()).GetFlux(« http://monservice.com/get/users« );

Aucun problème, on peut même binder le content 🙂

Sur Windows Phone 8 :

Service svc = new Service();
ThreadPool.RunAsync(


(source) =>
{
string content = svc.GetFlux("http://monservice.com/get/users");
}
);

Sur Windows 8, les Thread sont bien Async. On passe bien dans la CallBack avant de sortir de GetFlux, ce qui n’est pas le cas sur Windows Phone !

Du coup il faut utiliser le ThreadPool.RunAsync (Merci Vincent Lepleux  :))

Cool ! Maintenant on a de la donnée.

Allons un peu plus loin, je veux binder cette donnée. Avec le ThreadPool.RunAsync, je n’aurais pas accès à mon Thread UI !! C’est là qu’intervient notre ami le Dispatcher :

private void BindData(string content)
{
   System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
   {
     MyProperty = content;
   });
}
ThreadPool.RunAsync(

 (source) =>
   {
     string content = svc.GetFlux("http://monservice.com/get/users");
     BindData(content);
    }
);

Et la boucle est bouclée !

Merci à Pierre Cauchois pour sa relecture 🙂

Posted in Windows 8, Windows Phone 8 | 1 Comment »

WP7 : Comment internationaliser vos applications ?

Posted by Dorian LAMANDE sur janvier 18, 2011

Pour toucher un peu plus de monde sur le MarketPlace, il va falloir passer par une phase d’internationalisation de votre application.

Pour commencer on créer une simple application “Hello World”.

image

Ensuite on va ajouter un fichier de ressources : “AppResources”.

image

Ajoute une nouvelle Clef : “HelloWorld” avec la valeur “Hello World !”

image

Copier / Coller le ficher “AppResources.rsx” et renommer le en AppResources.fr.rsx. Ensuite remplace “Hello World !” par “Salut le Monde !”

Maintenant dans le code behind, nous allons dire que notre “PageTitle” contiendra notre “Hello World”.

public MainPage()
        {
            InitializeComponent();
            this.PageTitle.Text = AppResources.HelloWorld;
        }

Ensuite il faut aller éditer le fichier “.csproj” et ajouter “fr” dans le SupportedCulture :

<SupportedCultures>fr</SupportedCultures>

Si vous souhaitez ajouter l’espagnole ce sera comme ceci :

<SupportedCultures>fr;es</SupportedCultures>

Recharger votre solution. Déployer la sur votre émulateur. Nous avons la version anglaise.

image

Maintenant nous allons changer la langue de l’émulateur :

image

Validons et ré-exécutons notre application :

image

(J’ai rajouté un TextWrapping=”Wrap” pour l’affichage)

En complément de ce billet je vous invite à consulter le post de Pierre Cauchois sur “Comment localiser le titre d’une application ?”

http://blogs.msdn.com/b/pierreca/archive/2010/12/06/windows-phone-7-localisez-le-titre-ou-le-nom-de-votre-application.aspx

A bientôt.

Dorian LAMANDE

Posted in Non classé | 1 Comment »

Concours Windows Phone – ProgTV

Posted by Dorian LAMANDE sur août 25, 2010

Avec Yann Garit, nous participons au concours de développement sur Windows Phone 7 : Rendez vous ici : http://www.facebook.com/home.php#!/video/video.php?v=445160459896&oid=129459787073480 et cliquez sur « J’aime » pour nous soutenir !

C’est à vous de jouer 😉

Dorian LAMANDE

Posted in Divers | Leave a Comment »

WPF : Obtenir la “Duration” d’une vidéo

Posted by Dorian LAMANDE sur août 9, 2010

Lors d’un projet sur WPF, j’avais besoin d’obtenir la durée d’une vidéo.

Je me suis dit, c’est simple, je vais aller regarder le NaturalDuration… mais hélàs c’était trop simple :

    <Grid>
        <StackPanel Orientation="Horizontal">
        <Label>Duration :</Label>
        <TextBlock x:Name="tbDuration" Margin="0,5,0,0"></TextBlock>
        </StackPanel>
        <MediaElement x:Name="media" Visibility="Collapsed" ></MediaElement>
    </Grid>

OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = « Video Files (*.avi;*.mpg;.*mpeg;*.wmv)|*.avi;*.mpg;.*mpeg;*.wmv »;
openFileDialog.ShowDialog();
if (openFileDialog.FileName != String.Empty)
{
    media.Source = new Uri(openFileDialog.FileName);
    this.tbDuration.Text = media.NaturalDuration.TimeSpan.TotalMinutes.ToString();
}
image

Le seul moyen c’est d’entrer dans la méthode “MediaOpened” du mediaElement et de faire un play/pause manuellement.

Lire le reste de cette entrée »

Posted in WPF | Tagué: | 1 Comment »

WPF : Binding Enumeration Description

Posted by Dorian LAMANDE sur juin 7, 2010

Voici un petit billet pour vous montrer comment “binder” des descriptions qui viennent des enumerations sur des combobox.

1. Création de notre projet :

Ouvrons notre visual studio préféré (le 2010 !). Créons une nouvelle application WPF, que nous appelons “WPFBindingEnumeration.UI”, ajoutons tout de suite un second projet, de type “class library” “WPFBindingEnumeration.Entity” et dernier projet du même type : “WPFBindingEnumeration.Utils”

2. Création de l’énumération :

Ici on va se focaliser sur le cas suivant : notre client voudrait en affichage les situations familiales suivantes : Célibataire, Marié(e), Divorcé(e), Séparé(e), Pacsé(e), Veuf(ve), Autre.

Nous allons utiliser des descriptions afin de pouvoir permettre l’affichage de la liste dans une combobox.

public enum FamilialSituationEnum
{
    [Description("Célibataire")]
    Celibataire,
    [Description("Marié(e)")]
    Marie,
    [Description("Divorcé(e)")]
    Divorce,
    [Description("Séparé(e)")]
    Separe,
    [Description("Pacsé(e)")]
    Pacse,
    [Description("Veuf(ve)")]
    Veuf,
    [Description("Autre")]
    Autre
}

Lire le reste de cette entrée »

Posted in WPF | Tagué: , , , , | Leave a Comment »

Microsoft Windows Azure : Application MVC avec SQL AZURE

Posted by Dorian LAMANDE sur avril 2, 2010

Créer une application OnPremise est une chose plutôt simple. Et bien sachez que sur la plateforme Azure c’est aussi simple !

Pour notre application MVC, nous avons besoin d’un MembershipProvider, d’un RoleProvider et d’un ProfileProvider. Vous avez déjà pu jouer avec ces Providers via les Azure Tables. Maintenant les providers sont supportés par SQL AZURE. Microsoft a mis à dispositions les scripts qui vont bien.

http://code.msdn.microsoft.com/KB2006191/Release/ProjectReleases.aspx?ReleaseId=3539

Décompressez l’archive. Ouvrez SQL Server Mangement Studio et connectez-vous à votre base de données SQL AZURE. (Note: Fermez le prompt à l’ouverture de SSMS, cliquez sur New Query pour vous connectez)

image 

Lire le reste de cette entrée »

Posted in Windows Azure | Tagué: , , , , | 2 Comments »

Microsoft Windows Azure : Azure Tables et WPF

Posted by Dorian LAMANDE sur mars 26, 2010

Vous cherchez comment vous connecter aux Azure Tables autrement qu’avec un projet Cloud ? Je suis seigneur et je vais vous donner la solution.

Je vais me baser sur le post précédent, on va réaliser le même type d’application.

On aura toujours notre dll “Common” mais on va modifier un peu la classe “ContactRepository.cs”.

public class ContactRepository
{
    protected TableServiceContext Context;
    public const string TABLENAME = "Contacts";
    public ContactRepository()
    {
        Initialize();
    }

    //création du client pour accéder à l’Azure Storage
    private void Initialize()
    {
        try
        {                
            CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
            CloudTableClient tableStorageClient = storageAccount.CreateCloudTableClient();
            tableStorageClient.CreateTableIfNotExist(TABLENAME);
            this.Context = tableStorageClient.GetDataServiceContext();

            // en local
            if (storageAccount.Credentials.AccountName == "devstoreaccount1")
            {
                // Dummy, requis pour synchroniser le schéma avec le Development storage
                var dummyRow = new ContactEntry() { PartitionKey = "Dummy", RowKey = Guid.NewGuid().ToString() };
                this.Context.AddObject(TABLENAME, dummyRow);
                this.Context.SaveChangesWithRetries();
                this.Context.DeleteObject(dummyRow);
                this.Context.SaveChangesWithRetries();
            }
        }
        catch (Exception ex)
        {
            
        }

    }

Les CRUD, ne changent pas, ou presque …

 

Lire le reste de cette entrée »

Posted in Windows Azure | Tagué: , , , | Leave a Comment »