一、向源代码添加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”,它则是类似于三层架构中数据库操作类。代码如下:
publicclassStockDiffDatabase
{
SQLiteAsyncConnectiondatabase;
publicStockDiffDatabase(stringdbpath)
{
try
{
database=newSQLiteAsyncConnection(dbpath);
database.CreateTableAsyncModels.StockDiff().Wait();
}
catch(Exceptionex)
{
throwex;
}
}
publicSystem.Threading.Tasks.TaskListModels.StockDiffGetListAsync()
{
try
{
returndatabase.TableModels.StockDiff().ToListAsync();
}
catch(Exceptionex)
{
throwex;
}
}
publicTaskModels.StockDiffGetOneAsync(intid)
{
try
{
return
database.TableModels.StockDiff().Where(i=i.ID==id).FirstOrDefaultAsync();
}
catch(Exceptionex)
{
throwex;
}
}
publicTaskintSaveUpdateAsync(Models.StockDiffitem)
{
try
{
if(item.ID!=0)
{
return
database.UpdateAsync(item);
}
else
{
return
database.InsertAsync(item);
}
}
catch(Exceptionex)
{
throwex;
}
}
publicTaskintDelete(Models.StockDiffo)
{
try
{
returndatabase.DeleteAsync(o);
}
catch(Exceptionex)
{
throwex;
}
}
publicTaskintDeleteAll()
{
try
{
TableMappingm=newTableMapping(typeof(Models.StockDiff));
returndatabase.DeleteAllAsync(m);
}
catch(Exceptionex)
{
throwex;
}
}
}
上述C#数据库操作类需要的引用如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingSQLite;
此块C#源码包含创建数据库、读取数据、写入数据以及删除单行数据和清空数据的代码。代码使用后台线程的异步SQLite.NETAPI。此外,StockDiffDatabase构造函数将数据库文件的路径作为参数。
三、让安卓和iOS应用调用上述操作数据库代码
App.xaml.cs是整个程序的入口,所以数据库的初始化在此处执行
下面的代码相当于MVC框架中的V的内容,就是在界面上操作按钮,打开APP数据加载并显示
1、展开“App.xaml”,然后双击“App.xaml.cs”将其打开,添加代码
此处使用了单一实例模式,无论是JAVA还是C#开发者,都能很容易看明白此处代码。,将SQLite数据库文件路径做为参数,实例化数据库操作类。这样就可以在后续功能中使用它。
2、在按钮中实现保存功能
Models.StockDiffoo=newModels.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"));
Taskintii=App.Database.SaveUpdateAsync(oo);
((Button)FindByName("btnClear")).IsVisible=true;
App.Database.SaveUpdateAsync()方法使用了LINQ,所以并不需要我们再写Insert或update了。保存数据后,会显示btnClear清空按钮,用于清空列表显示
3、从数据库读取数据并绑定控件显示
基于移动端控件的不同,这里肯定不再像以前c#winform,asp.net中那些datagrid,repeater这样的控件。这里使用的是移动端开发独有的TableView,StackLayout控件。
protectedoverrideasyncvoidOnAppearing()
{
base.OnAppearing();
TableViewtbv=(TableView)FindByName("tbV");
ListModels.StockDifflst=awaitApp.Database.GetListAsync();
if(lst.Count==0)
{
((Button)FindByName("btnClear")).IsVisible=false;
}
foreach(Models.StockDiffoinlst)
{
#region
try
{
varlayout=newStackLayout(){Orientation=StackOrientation.Horizontal};
layout.Children.Add(newLabel()
{
Text=o.Amt.ToString(),
TextColor=Color.FromHex("#"),
VerticalOptions=LayoutOptions.Center
});
layout.Children.Add(newLabel()
{
Text=o.PriceSold.ToString(),
TextColor=Color.FromHex("#"),
VerticalOptions=LayoutOptions.Center,
});
layout.Children.Add(newLabel()
{
Text=o.PriceBuy.ToString(),
TextColor=Color.FromHex("#"),
VerticalOptions=LayoutOptions.Center,
});
layout.Children.Add(newLabel()
{
Text="结果:"+o.PriceFinal.ToString("f2"),
TextColor=Color.FromHex("#0f0f0f"),
VerticalOptions=LayoutOptions.Center,
HorizontalOptions=LayoutOptions.EndAndExpand
});
tbv.Root.Insert(
0,
newTableSection()
{
newViewCell(){View=layout}
}
);
}
catch(Exceptionex)
{
}
#endregion
}
}
OnAppearing是在app加载界面时会执行的方法,绑定数据并显示就写在此。
原理:
从本机数据库中读取数据放进LIST中
以Stacklayout方式动态的将LIST中的数据加载进来后塞进TableView中完成在app界面中展示数据(这样的方式展示数据是基于tableview控件的展示需要,是用Tableview还是其它控件则由开发者决定,不同的控件则这里的代码就会不同)
如果数据没有则隐藏btnClear清空按钮,如果有数据则不隐藏。
写在最后:
通过Xamarin,C#开发者可以很容易的上手开发安卓和iOSapp读写手机本地数据库存储,而且是一份代码两种APP跨平台使用。
C#和JAVA开发者烂熟于心的三层架构、MVC、数据库单例模式的开发思维,也可毫无阻碍的使用在跨平台的app开发中
荐于Xamarin,C#和.NET开发者,对于JAVA开发者,python开发者在移动端开发上,更有优势。
推荐阅读下方往期文章,完整舒述C#跨平台开发iOS和Android
往期文章:
用微软编程,在iphone真机上运行调试app
C国内已放弃?一份源码同时完成Android和IOS两种APP