Как настроить базу данных xamarin API SQL - PullRequest
0 голосов
/ 03 марта 2020

Сначала немного по лету, я пытаюсь создать приложение, которое имеет соединение с базой данных и может обновлять веб-сайт в реальном времени. Таким образом, вы можете видеть в режиме реального времени табло.

Сначала я создал в диспетчере серверов Microsoft SQL базу данных со следующим запросом:

create Database EscapeGebruikers

Use EscapeGebruikers
create table Challenger 
(
    ChallengerID int identity not null,
    AantalPers int not null,
    TeamNaam varchar(255) not null,
    primary key (ChallengerID)
);

Use EscapeGebruikers
create table Ranking
(
    RankID int identity not null,
    ChallengerID int not null,
    ScoreMin tinyint not null,
    ScoreSec tinyint not null,
    DateAchieved datetime not null,
    primary key (RankID)
);

Use EscapeGebruikers
create table Wachtwoorden 
(
    ID int not null Identity Primary key,
    Wachtwoord varchar(128) not null,
    Beschrijving varchar(255)
);

Delete from GroepTijd where TeamNaam = 'Pannenkoeken'

Select * from Ranking
select * from Challenger
select * from Wachtwoorden

Это простая база данных для отслеживания команд, которые использовать приложение, это приложение будет распространяться только на 1 таблетке. Так что там не так много трафика c или что с того. Он отслеживает количество людей, название команды, которое они выбирают, время, которое они установили (оценка мин = минуты, оценка c = секунды), чтобы я мог представить счет в минутах и ​​секундах, а также дату, когда они достигли этого результата.

Так что я пытаюсь некоторое время отправлять и читать данные с приложением. При входе в xamarin я пытаюсь отправить данные в базу данных. Я видел, что вы можете писать напрямую в базу данных, но это менее безопасно. Таким образом, предложенный мной способ - использовать API. Я не знаком с API, но нашел отличный учебник: Учебник, которому я следовал

Этот учебник является именно тем, что мне было нужно, поэтому я следовал и изменил код, чтобы он соответствовал моей базе данных с именами и функции. Вот что у меня получается, когда нажимается кнопка в форме:

using System;
using EscapeHaarlem.Classes;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace EscapeHaarlem.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class PasswordPage : ContentPage
    {
        public PasswordPage ()
        {
            InitializeComponent ();
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            NavigationPage.SetHasBackButton(this, false);
        }
        async void CheckExistingProfileAndSave(string teamnaam)
        {
            if (Utils.IsConnectedToInternet())
            {
                try
                {
                    PlayerData player = await PlayerManager.CheckExistingPlayer(teamnaam);
                    if (string.IsNullOrEmpty(player.TeamNaam))
                    {
                        await App.Current.MainPage.DisplayAlert("Error", "Email does not exist.", "OK");
                    }
                    else
                    {
                        Settings.TeamTeamNaam = entryTeamNaam.Text.Trim();
                        Settings.AantalPers = Int32.Parse(entryAantalPers.Text);
                        Settings.DateAchieved = player.DateAchieved;
                        App.Current.MainPage = new RedButton(entryTeamNaam.Text);
                    }
                }
                catch
                {
                    await App.Current.MainPage.DisplayAlert("Oops", "An error occured while connecting to the server. Please check your connection.", "OK");
                }
            }
            else
            {
                await App.Current.MainPage.DisplayAlert("Error", "No internet connection.", "OK");
            }

            btnLogin.IsEnabled = true;
        }

        void Save()
        {
            Settings.TeamTeamNaam = entryTeamNaam.Text.Trim();
            Settings.AantalPers = Int32.Parse(entryAantalPers.Text);
            App.Current.MainPage = new RedButton(entryTeamNaam.Text);
        }

        private void Button_Clicked(object sender, EventArgs e)
        {
            if (entryWachtwoord.Text == "admin" && Int32.Parse(entryAantalPers.Text) > 2 && Int32.Parse(entryAantalPers.Text) < 7 && entryTeamNaam.Text.Length > 1)
                CheckExistingProfileAndSave(entryTeamNaam.Text);
            else
                App.Current.MainPage.DisplayAlert("Let op!", "Groepsgrootte is 3 tot 6 deelnemers. Indien aan deze voorwaarde is voldaan is het wachtwoord niet correct. Kom je er niet uit vraag de begeleider om hulp!", "Okay");
        }
    }
}

Так что, если я правильно понимаю, при нажатии кнопки необходимо проверить имя команды, если в базе данных уже есть запись с это имя команды. Если это так, вы не можете использовать это имя команды. В операторе try catch из функции CheckExistingProfileAndSave он запустит ошибку catch. Итак, что-то пошло не так, я не уверен, что пошло не так.

Когда я пытаюсь отладить этот код с точками останова, он запускает PlayerData player = await PlayerManager.CheckExistingPlayer(teamnaam);. Поэтому я пошел по этому пути CheckExistingPlayer.

Это привело меня к следующему блоку кода:

 public async static Task<PlayerData> CheckExistingPlayer(string teamnaam)
        {
            REST.GameAPI api = new REST.GameAPI();
            PlayerData player = new PlayerData();

            if (Utils.IsConnectedToInternet())
            {
                player = await api.GetPlayerData(teamnaam);
            }

            return player;
        }

Где я снова установил точки останова, чтобы узнать, выполняет ли он функцию внутри оператора if. Итак, я снова последовал за этим, куда это привело меня.

Это следующий код:

 public async Task<PlayerData> GetPlayerData(string teamnaam)
        {
            var uri = new Uri($"{APIUri}/GetPlayerProfile?teamnaam={teamnaam}");
            PlayerData player = null;

            var response = await ProcessGetAsync(uri);
            if (response.IsSuccessStatusCode)
            {
                player = new PlayerData();
                var content = await response.Content.ReadAsStringAsync();
                player = JsonConvert.DeserializeObject<PlayerData>(content);
            }

            return player;
        }

И это та часть, где все идет не так, как мне кажется. var response = await ProcessGetAsync(uri); этот код детали отправляет URI, который составлен следующим образом:

var uri = new Uri($"{APIUri}/GetPlayerProfile?teamnaam={teamnaam}");

У меня еще нет доменного имени, поэтому я не уверен, что должно быть вместо APIUri. Но я обнаружил, что есть бесплатные API, которые вы могли бы использовать, поэтому я использовал для API следующие: private const string APIUri = "https://jsonplaceholder.typicode.com/posts";.

После этой отправки полный код URI:

private async Task<HttpResponseMessage> ProcessGetAsync(Uri uri)
{
    return await client.GetAsync(uri);
}

Достаточно грустно, что это не получит или не установит базу данных каким-либо образом.

Надеюсь, кто-то может сказать мне, что не так и почему.

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...