Jak dodać Azure Mobile Service do projektu Xamarin.Android? [PORADNIK]

W tym poradniku wykorzystamy MobileApp stworzoną na potrzeby tego poradnika.

Będziemy potrzebować także projektu w Visual Studio do którego chcemy dodać funkcjonalność bazy danych. Będzie to słownik angielsko-polski.

W Solution Explorerze klikamy kolejno: PPM na projekcie -> Manage NuGet Packages… i wyszukujemy Microsoft.Azure.Mobile.Client, następnie wybieramy tą opcję i instalujemy pakiet w projekcie.

Po zaakceptowaniu warunków korzystania i zainstalowaniu pakietów przechodzimy do MainActivity i dodajemy w nim:


using Microsoft.WindowsAzure.MobileServices;

Następnie tworzymy nową klasę, która będzie  odpowiadać strukturze tabeli w naszej danych, a jej zadaniem będzie przechowywać słówka.

Nazwijmy ją Words.cs i dodajmy kilka tabel:


using System;
using Microsoft.WindowsAzure.MobileServices;
using Newtonsoft.Json;

namespace SłownikOnline
{
public class Words
{
string id;
string wordEN;
string wordPL;

[JsonProperty(PropertyName = "id")]
public string Id
{
get { return id; }
set { id = value; }
}

[JsonProperty(PropertyName = "worden")]
public string WordEN
{
get { return wordEN; }
set { wordEN = value; }
}

[JsonProperty(PropertyName = "wordpl")]
public string WordPL
{
get { return wordPL; }
set { wordPL = value; }
}

[Version]
public string Version { get; set; }

}
}

Następnym krokiem jest dodanie tabeli dla naszej bazy danych w MobileApp na Azure. Aby to zrobić przechodzimy kolejno:

i zatwierdzamy OK.

Pora dodać kolumny według schematu jaki utworzyliśmy w klasie Word.cs. Aby to zrobić przechodzimy kolejno według zaznaczonych niebieskim kolorem pól:

i według tego schematu:

dodajemy pola:

  • wordPL
  • wordEN

W następnym etapie tworzymy menedżera zarządzania połączeniem z naszą bazą słów.

W tym celu dodajemy nową klasę i nazwiemy ją WordManager.cs. Będzie ona posiadać system inicjowania połączenia z bazą danych a także dwie metody służące do zapisu i odczytu danych z tabeli Words.

Ważne! w konstruktorze, w linijce odpowiedzialnej za łączenie się z url naszej aplikacji serwerowej podajemy swój adres, który możemy zdobyć przechodząc:


using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.MobileServices;
using Newtonsoft.Json.Linq;

namespace SlownikOnline
{
public partial class WordsManager
{
static WordsManager defaultInstance = new WordsManager();
MobileServiceClient client;
IMobileServiceTable<Words> wordsTable;

//konstruktor łączący się z serwisem używając jego url
private WordsManager()
{
this.client = new MobileServiceClient(@"https://listazakupow.azurewebsites.net")
{
SerializerSettings = new MobileServiceJsonSerializerSettings()
{
CamelCasePropertyNames = true
}
};

this.wordsTable = client.GetTable<Words>();
}

public static WordsManager DefaultManager
{
get { return defaultInstance; }
set { defaultInstance = value; }
}

public MobileServiceClient CurrentClient
{
get { return client; }
}

public bool isOfflineEnabled
{
get { return wordsTable is Microsoft.WindowsAzure.MobileServices.Sync.IMobileServiceSyncTable<Words>; }
}

//metoda służąca do pobrania wszystkich słówek z bazy
public async Task<List<Words>> GetWordsAsync(bool syncItems = false)
{
try
{
List<Words> allWords = await wordsTable
.Where(Words => Words.Id != String.Empty).ToListAsync();
return allWords;
}
catch (MobileServiceInvalidOperationException msioe)
{
Debug.WriteLine(@"Invalid sync operation: {0}", msioe.Message);
}
catch (Exception e)
{
Debug.WriteLine(@"Sync error: {0}", e.Message);
}
return null;
}

//metoda do zapisu słówka w bazie
public async Task SaveWordAsync(JObject word)
{
await wordsTable.InsertAsync(word);
}
}
}

Zapewniliśmy stronę logiczną dla naszej aplikacji. Teraz należy stworzyć widok dla użytkownika.

W Solution Explorer przechodzimy do folderu Resources -> layout i edytujemy Main.axml.

Tworzymy przykładowy widok:

czyli ListView + dwa Buttony wg kodu:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="25px"
android:minHeight="25px">
<ListView
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="400dp"
android:id="@+id/wordList" />
<Button
android:text="Pobierz!"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:id="@+id/btnGetWords"
android:layout_gravity="center_horizontal" />
<Button
android:text="Dodaj"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/btnAddWord" />
</LinearLayout>

Ostatni etap oprogramowanie przycisku „Pobierz!” w głównej aktywności Aplikacji. W tym celu przechodzimy do MainActivity.cs, dodajemy referencje zarówno do ListView jak i Buttonów a następnie tworzymy dwie metody zapisujące rekordy z tabeli do ListView.

Ostateczna postać MainActivity:


using Android.App;
using Android.Widget;
using Android.OS;
using Microsoft.WindowsAzure.MobileServices;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;

namespace SlownikOnline
{
[Activity(Label = "SlownikOnline", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
Button btnGetWords;
ListView ListViewWord;
WordsManager manager;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView (Resource.Layout.Main);

btnGetWords = FindViewById<Button>(Resource.Id.btnGetWords);
ListViewWord = FindViewById<ListView>(Resource.Id.ListViewWord);

btnGetWords.Click += OnGetWords;

//Inicjujemy połączenie z tabelą Words w bazie danych
manager = WordsManager.DefaultManager;
}

private async void OnGetWords(object sender, EventArgs e)
{
await setWordList();
}

//Dodajemy wszystkie słówka z tabeli Words do naszego ListViewWord, które widzi użytkownik
private async Task setWordList()
{
var Data = await manager.GetWordsAsync();
var words = new List<String>();
foreach (Words item in Data)
{
words.Add(item.WordPL + " - " + item.WordEN);
}
ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, words);
ListViewWord.Adapter = adapter;
}
}
}

 

Oczywiście z tabeli nie zostanie pobrany żaden rekord, ponieważ jest ona jeszcze pusta.

W kolejnym tutorialu zostanie dodana funkcjonalność zapisywania do tabeli nowych słówek.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*