东北大学全栈开发课程笔记3

本文介绍如何使用Xamarin进行异步操作,包括创建数据库、插入和查询Poetry数据。通过IDatabaseService接口实现数据库操作,并在DatabaseService中展示具体实现,如创建`Poetry`表,使用SQLite Async Connection进行操作。
摘要由CSDN通过智能技术生成

数据库:

  1. 创建数据库

  2. 插入数据

  3. 列出数据

都是异步操作Async函数,返回值为Task

IService

  • Poetry.cs

public class Poetry
{
    //特性 Attribute
    //属性 Property Character
    [PrimaryKey,AutoIncrement]//主键自增
    public int Id { get; set; }//prop快捷键
    public string Title { get; set; }
}
  • IDatabaseService.cs

public interface IDatabaseService
{
    Task CreateDatabaseAsync();//创建数据库是异步的
    Task InsertPoetryAsync(Poetry poetry);//插入数据 异步
    Task<IList<Poetry>> ListPoetriesAsync();//列出数据 异步 IList是接口 List是类 接口更加抽象 返回类型尽量抽象
}
  • DatabaseService.cs

public class DatabaseService : IDatabaseService
{
    //不同平台文件位置不同:标准化解决办法
    private string databasePath = Path.Combine(
        Environment.GetFolderPath(
            Environment.SpecialFolder.LocalApplicationData), //获取到本地存储的路径
        "poetry.db");//文件夹,文件名
​
    //创建数据库连接
    private SQLiteAsyncConnection _connection;
​
    private SQLiteAsyncConnection Connection =>
        _connection ?? (_connection = 
                        new SQLiteAsyncConnection(databasePath));
​
    //创建表
    public async Task CreateDatabaseAsync()
    {
        await Connection.CreateTableAsync<Poetry>();
    }
​
    //表中插入数据
    public async Task InsertPoetryAsync(Poetry poetry)
    {
        await Connection.InsertAsync(poetry);
    }
​
    //列出表中数据
    public async Task<IList<Poetry>> ListPoetriesAsync()
    {
        return await Connection.Table<Poetry>().ToListAsync();
    }
}
  • MainPageViewModel.cs

public class MainPageViewModel : ViewModelBase
{
    private string _result;
​
    public string Result
    {
        get => _result;
        set => Set(nameof(Result), ref _result, value);
    }
​
    private Token _token;
​
    public Token Token
    {
        get => _token;
        set => Set(nameof(Token), ref _token, value);
    }
​
    private RelayCommand _clickMeCommand;
​
    public RelayCommand ClickMeCommand =>
        _clickMeCommand ?? (_clickMeCommand = 
                            new RelayCommand(() => Result = "Hello World!"));
​
    private RelayCommand _getTokenCommand;
    // MVVM + IService(帮ViewModel干活)
    public RelayCommand GetTokenCommand =>
        _getTokenCommand ?? (_getTokenCommand =
                             new RelayCommand(async() =>//async函数 await
                                              {
                                                  Token = await _tokenService.GetTokenAsync();
                                              }));
*****************************************************************************************
    //创建数据库命令
    private RelayCommand _createDatabaseCommand;
​
    public RelayCommand CreateDatabaseCommand =>
        _createDatabaseCommand ?? (_createDatabaseCommand = new RelayCommand(async () =>
                                                                             {
                                                                                 await _databaseService.CreateDatabaseAsync();
                                                                             }));
    //插入数据命令
    private RelayCommand _insertCommand;
​
    public RelayCommand InsertCommand =>
        _insertCommand ?? (_insertCommand = new RelayCommand(async () =>
                                                             {
                                                                 await _databaseService.InsertPoetryAsync(
                                                                     new Poetry { Title = "123" });//语法糖
                                                             }));
​
    //列出所有数据命令
    private RelayCommand _listCommand;
​
    public RelayCommand ListCommand =>
        _listCommand ?? (_listCommand = new RelayCommand(async () =>
                                                         {
                                                             var poetryList = await _databaseService.ListPoetriesAsync();
                                                             //将poetryList里的东西加入PoetryCollection (只能一个一个加)for each
                                                             foreach (var poetry in poetryList)
                                                             {
                                                                 PoetryCollection.Add(poetry);
                                                             }
                                                         }));
​
    public ObservableCollection<Poetry> PoetryCollection =
        new ObservableCollection<Poetry>();
​
    public MainPageViewModel(ITokenService tokenService,IDatabaseService databaseService)
    {
        _tokenService = tokenService;//保证ViewModel一定能拿到TokenService
        _databaseService = databaseService;//保证ViewModel一定能拿到DaService
    }
​
    private ITokenService _tokenService;
​
    private IDatabaseService _databaseService;
}
  • ViewModelLocator.cs

    public class ViewModelLocator
    {
        public MainPageViewModel MainPageViewModel =>
            SimpleIoc.Default.GetInstance<MainPageViewModel>();
        
        public ViewModelLocator()
        {
            SimpleIoc.Default.Register<MainPageViewModel>();//注册MainPageViewModel
            SimpleIoc.Default.Register<ITokenService,TokenService>();//注册ViewModel需要的ITokenService
*****************************************************************************************
    
            SimpleIoc.Default.Register<IDatabaseService,DatabaseService>();//注册ViewModel需要的IDatabaseService
        }
    }
  • MainPage.xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             BindingContext="{Binding MainPageViewModel, Source={StaticResource ViewModelLocator}}"
             <!-- 绑定来自ViewModelLocator的MainPageViewModel -->
             x:Class="HelloWorld.MainPage">
​
    <StackLayout>
        <Label Text="{Binding Result}" FontSize="48"/>
        <Button Command="{Binding ClickMeCommand}"
                Text="ClickMeButton"/>
        <Button Command="{Binding GetTokenCommand}"
                Text="GetTokenButton"/>
        <Label Text="{Binding Token.data}"/>
        <Button Command="{Binding CreateDatabaseCommand}"
                Text="CreateDatabaseButton"></Button>
        <Button Command="{Binding InsertCommand}"
                Text="InsertButton"></Button>
        <Button Command="{Binding ListCommand}"
                Text="ListButton"></Button>
        <!--批量显示数据-->
        <!-- 绑定要绑定到属性上 -->
        <ListView ItemsSource="{Binding PoetryCollection}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Label Text="{Binding Title}" />
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
​
    </StackLayout>
​
</ContentPage>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值