C# 实现安卓和iOS app 读写数据库,实现手机本地存储
C# 一份app源码读写数据库,完美实现iOS和Android跨平台共用,无需编写两遍代码
一、向源代码添加SQLite
向解决方案添加NuGet包
右击解决方案 > 管理解决方案的NuGet 程序包
在“浏览”选项卡中搜索“sqlite-net-pcl”NuGet 包 ,如上图
许多 NuGet 包都有着类似的名称。 正确找到项目要用的包,具有以下属性:
- 作者:SQLite-net
- NuGet 链接:sqlite-net-pcl
二、向源代码加入数据库代码
有三层架构的开发经验的人员,了解MVC框架的开发者,会很熟悉下面的代码。
1、项目中添加Models文件夹
2、向Models 文件夹下添加cs文件,取名“StockDiff.cs”, 它是对应SQLite表的类。相当于MVC中的M
3、项目中添加Data文件夹
4、向Data文件夹下添加cs文件,取名“StockDiffDatabase.cs”,它则是类似于三层架构中数据库操作类。代码如下:
public class StockDiffDatabase
{
SQLiteAsyncConnection database;
public StockDiffDatabase(string dbpath)
{
try
{
database = new SQLiteAsyncConnection(dbpath);
database.CreateTableAsync<Models.StockDiff>().Wait();
}
catch (Exception ex)
{
throw ex;
}
}
public System.Threading.Tasks.Task<List<Models.StockDiff>> GetListAsync()
{
try
{
return database.Table<Models.StockDiff>().ToListAsync();
}
catch (Exception ex)
{
throw ex;
}
}
public Task<Models.StockDiff> GetOneAsync(int id)
{
try
{
return
database.Table<Models.StockDiff>().Where(i => i.ID == id).FirstOrDefaultAsync();
}
catch (Exception ex)
{
throw ex;
}
}
public Task<int> SaveUpdateAsync(Models.StockDiff item)
{
try
{
if (item.ID != 0)
{
return
database.UpdateAsync(item);
}
else
{
return
database.InsertAsync(item);
}
}
catch (Exception ex)
{
throw ex;
}
}
public Task<int> Delete(Models.StockDiff o)
{
try
{
return
database.DeleteAsync(o);
}
catch (Exception ex)
{
throw ex;
}
}
public Task<int> DeleteAll()
{
try
{
TableMapping m = new TableMapping(typeof(Models.StockDiff));
return database.DeleteAllAsync(m);
}
catch (Exception ex)
{
throw ex;
}
}
}
上述C#数据库操作类需要的引用如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using SQLite;
此块C#源码包含创建数据库、读取数据、写入数据以及删除单行数据和清空数据的代码。 代码使用后台线程的异步 SQLite.NET API。 此外,StockDiffDatabase
构造函数将数据库文件的路径作为参数。
三、让 安卓 和 iOS 应用调用上述操作数据库代码
- App.xaml.cs 是整个程序的入口,所以数据库的初始化在此处执行
- 下面的代码相当于MVC框架中的V的内容,就是在界面上操作按钮,打开APP数据加载并显示
1、展开“App.xaml”,然后双击“App.xaml.cs”将其打开 ,添加代码
此处使用了单一实例模式,无论是JAVA 还是 C# 开发者,都能很容易看明白此处代码。,将SQLite数据库文件路径做为参数,实例化数据库操作类。 这样就可以在后续功能中使用它。
2、在按钮中实现保存功能
Models.StockDiff oo = new Models.StockDiff();
oo.Amt = int.Parse( txtAmt.Text);
oo.PriceSold = decimal.Parse(txtSold.Text);
oo.PriceBuy = decimal.Parse(txtBuy.Text);
oo.PriceFinal = decimal.Parse(fin.ToString("f2"));
Task<int> ii = App.Database.SaveUpdateAsync(oo);
((Button)FindByName("btnClear")).IsVisible = true;
SaveUpdateAsync() 方法使用了LINQ,所以并不需要我们再写Insert 或 update了。保存数据后,会显示btnClear清空按钮,用于清空列表显示
3、从数据库读取数据并绑定控件显示
基于移动端控件的不同,这里肯定不再像以前c# winform,asp.net中那些datagrid , repeater这样的控件。这里使用的是移动端开发独有的TableView,StackLayout 控件。
protected override async void OnAppearing()
{
base.OnAppearing();
TableView tbv = (TableView)FindByName("tbV");
List<Models.StockDiff> lst = await App.Database.GetListAsync();
if (lst.Count == 0)
{
((Button)FindByName("btnClear")).IsVisible = false;
}
foreach (Models.StockDiff o in lst)
{
#region
try
{
var layout = new StackLayout() { Orientation = StackOrientation.Horizontal };
layout.Children.Add(new Label()
{
Text = o.Amt.ToString(),
TextColor = Color.FromHex("#503026"),
VerticalOptions = LayoutOptions.Center
});
layout.Children.Add(new Label()
{
Text = o.PriceSold.ToString(),
TextColor = Color.FromHex("#503026"),
VerticalOptions = LayoutOptions.Center,
});
layout.Children.Add(new Label()
{
Text = o.PriceBuy.ToString(),
TextColor = Color.FromHex("#503026"),
VerticalOptions = LayoutOptions.Center,
});
layout.Children.Add(new Label()
{
Text = "结果:" + o.PriceFinal.ToString("f2"),
TextColor = Color.FromHex("#0f0f0f"),
VerticalOptions = LayoutOptions.Center,
HorizontalOptions = LayoutOptions.EndAndExpand
});
tbv.Root.Insert(
0,
new TableSection()
{
new ViewCell() {View = layout}
}
);
}
catch (Exception ex)
{
}
#endregion
}
}
OnAppearing 是在app加载界面时会执行的方法,绑定数据并显示就写在此。
原理:
- 从本机数据库中读取数据放进LIST中
- 以Stacklayout方式动态的将LIST中的数据加载进来后塞进TableView中完成在app界面中展示数据(这样的方式展示数据是基于tableview控件的展示需要,是用Tableview还是其它控件则由开发者决定,不同的控件则这里的代码就会不同)
- 如果数据没有则隐藏btnClear清空按钮,如果有数据则不隐藏。
写在最后:
通过Xamarin,C# 开发者可以很容易的上手开发安卓和iOS app读写手机本地数据库存储,而且是一份代码两种APP跨平台使用。
C#和JAVA 开发者烂熟于心的三层架构、MVC、数据库单例模式的开发思维,也可毫无阻碍的使用在跨平台的app开发中
Xamarin难道还是鸡肋吗????
博主往期文章:
更多推荐
所有评论(0)