C# 实现安卓和iOS app 读写数据库,实现手机本地存储

C# 实现安卓和iOS app 读写数据库,实现手机本地存储_第1张图片

一、向源代码添加SQLite

向解决方案添加NuGet包

C# 实现安卓和iOS app 读写数据库,实现手机本地存储_第2张图片

右击解决方案 > 管理解决方案的NuGet 程序包

“浏览”选项卡搜索“sqlite-net-pcl”NuGet 包 如上图

许多 NuGet 包都有着类似的名称。 正确找到项目要用的,具有以下属性:

  • 作者:SQLite-net
  • NuGet 链接:sqlite-net-pcl


二、向源代码加入数据库代码

有三层架构的开发经验的人员,了解MVC框架的开发者,会很熟悉下面的代码。

1、项目中添加Models文件夹

2、向Models 文件夹下添加cs文件,取名“StockDiff.cs”, 它是对应SQLite表的类。相当于MVC中的M

C# 实现安卓和iOS app 读写数据库,实现手机本地存储_第3张图片

3、项目中添加Data文件夹

C# 实现安卓和iOS app 读写数据库,实现手机本地存储_第4张图片

4、向Data文件夹下添加cs文件,取名“StockDiffDatabase.cs”,它则是类似于三层架构中数据库操作类。代码如下:

    public class StockDiffDatabase
    {
        SQLiteAsyncConnection database;

        public StockDiffDatabase(string dbpath)
        {
            try
            {
                database = new SQLiteAsyncConnection(dbpath);
                database.CreateTableAsync().Wait();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public System.Threading.Tasks.Task> GetListAsync()
        {
            try
            {
                return database.Table().ToListAsync();
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public Task GetOneAsync(int id)
        {
            try
            {
                return
                database.Table().Where(i => i.ID == id).FirstOrDefaultAsync();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Task 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 Delete(Models.StockDiff o)
        {
            try
            {
                return
                database.DeleteAsync(o);

                
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Task 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”将其打开 ,添加代码

C# 实现安卓和iOS app 读写数据库,实现手机本地存储_第5张图片

此处使用了单一实例模式,无论是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 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 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加载界面时会执行的方法,绑定数据并显示就写在此。

原理:

  1. 从本机数据库中读取数据放进LIST中
  2. 以Stacklayout方式动态的将LIST中的数据加载进来后塞进TableView中完成在app界面中展示数据(这样的方式展示数据是基于tableview控件的展示需要,是用Tableview还是其它控件则由开发者决定,不同的控件则这里的代码就会不同)
  3. 如果数据没有则隐藏btnClear清空按钮,如果有数据则不隐藏。

写在最后:

通过Xamarin,C# 开发者可以很容易的上手开发安卓和iOS app读写手机本地数据库存储,而且是一份代码两种APP跨平台使用。

C#和JAVA 开发者烂熟于心的三层架构、MVC、数据库单例模式的开发思维,也可毫无阻碍的使用在跨平台的app开发中

Xamarin难道还是鸡肋吗????

博主往期文章:

c# 比JAVA弱吗? 用c#一份源码同时生成安卓和IOS APP

.NET C#开发app在iphone 真机上运行调试

你可能感兴趣的:(C#开发iOS,iOS和安卓,源代码,数据库)