Сначала немного по лету, я пытаюсь создать приложение, которое имеет соединение с базой данных и может обновлять веб-сайт в реальном времени. Таким образом, вы можете видеть в режиме реального времени табло.
Сначала я создал в диспетчере серверов 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);
}
Достаточно грустно, что это не получит или не установит базу данных каким-либо образом.
Надеюсь, кто-то может сказать мне, что не так и почему.
Заранее спасибо