数据库:
-
创建数据库
-
插入数据
-
列出数据
都是异步操作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>