Win10 IoT C#開發 5 - 操作 IoT 裝置內嵌 SQLite 資料庫 CURD

來源:互聯網
上載者:User

標籤:

Windows 10 IoT Core 是微軟針對物聯網市場的一個重要產品,與以往的Windows版本不同,是為物聯網裝置專門設計的,硬體也不僅僅限於x86架構,同時可以在ARM架構上運行。

前幾章我們講了 Raspberry 安裝 Win10 IoT 系統及搭建開發環境、部署程式及操作 GPIO 和 UART 的方法,通過這些功能我們已經可以獲得到感應器發送給我們的資料,但是如果資料不能及時推送回伺服器就需要在本機快取,使用 SQLite 資料庫是一個不錯的選擇。這一章我們來看如何操作 IoT裝置上的 SQLite資料庫。如果對安裝部署過程還不熟悉可以參考前幾篇文章,Raspberry安裝 IoT系統及搭建開發環境(http://www.cnblogs.com/cloudtech/p/5562120.html),建立 IoT應用及三種部署方法(http://www.cnblogs.com/cloudtech/p/5637983.html)。

 

準備工作:

刷好Win 10 IoT Core系統的 Raspberry Pi 2

部署Visual Studio 2015開發環境的PC

安裝sqlite3的PC

 

實驗目標:部署應用程式到 IoT裝置,並在裝置上建立 SQLite資料庫,進行 CURD操作。通過 FTP下載 IoT裝置端的 SQLite資料庫,在PC端使用 sqlite3查看資料庫中的資料來驗證資料庫操作成功。

1.Visual Studio 2015 安裝 SQLite 擴充

開啟 VS2015在 Tools 菜單中選擇 Extensions and Updates 功能表項目。

為 VS2105安裝 SQLite的平台擴充,在搜尋方塊中輸入sqlite尋找,Search Results 中選擇 SQLite for Universal Windows Platform 進行下載安裝。

2.建立IoT項目並引用SQLite擴充

首先建立一個 Universal Windows應用程式,開啟 VS 2015 點擊 New Project 在Visual C# -> Windows -> Universal 中找到 Blank App (Universal Windows) 項目模板,選中模板輸入項目名稱後點擊OK按鈕建立項目。

建立完成後為項目添加 SQLite平台擴充,右鍵選中項目點擊 Add Reference,在快顯視窗的樹視圖中選中 Universal Windows -> Extensions,列表中勾選 SQLite for Universal Windows Platform。

然後為項目添加 SQLite的類庫的引用,在 Tools菜單中選擇 NuGet Package Manager的 Manage NuGet Packages for Solution的功能表項目。

在彈出的 NuGet介面中搜尋 sqlitepcl,在搜尋結果列表中選擇SQLitePCL,勾選右側項目列表中的 CloudTechIoT5,點擊 Install按鈕開始安裝。

3.編寫代碼

代碼工作流程:

首先在 IoT裝置上建立名為 IoT5DB.sdf 的 SQLite資料庫檔案,在資料庫中建立表 users,包含2個欄位,id為主鍵 Integer類型自增長,name為text類型,向users表中插入三條資料,name欄位值分別為 IoT-1、IoT-2、IoT-3。

然後更改第二條資料的name欄位值為"IoT-dd-HH:mm:ss"格式,時間為目前時間。

最後刪除第一條資料。

完整代碼如下:

MainPage.xaml.cs

namespace CloudTechIot5{    //http://www.cnblogs.com/cloudtech    //[email protected]    public sealed partial class MainPage : Page, INotifyPropertyChanged    {        #region Fields        //資料庫名        private string _dbName;        //表名        private string _tableName;        //name欄位的資料集合        private string[] _names = { "IoT-1", "IoT-2", "IoT-3" };        #endregion        #region Events        public event PropertyChangedEventHandler PropertyChanged;        #endregion        #region Properties        private string _result;        //操作結果        public string Result        {            get            {                return _result;            }            set            {                _result = value;                OnPropertyChanged("Result");            }        }        #endregion        #region Constructor        public MainPage()        {            //初始化            _result = "Processing...";            _dbName = "IoT5DB.sdf";            _tableName = "users";            this.InitializeComponent();            //簡易MVVM架構            this.DataContext = this;            //建立資料庫連接            using (SQLiteConnection connection = CreateDbConnection())            {                //建立表                CreateTable(connection);                foreach (string name in _names)                {                    //插入資料                    InsertRow(connection, name);                }                //更新第二條資料                UpdateRow(connection, string.Format("IoT-{0}", DateTime.Now.ToString("dd-HH:mm:ss")), _names[1]);                //刪除第一條資料                DeleteRow(connection, _names[0]);            }            //更新介面            Result = "Completed...";        }        #endregion        #region Methods        private SQLiteConnection CreateDbConnection()        {            //建立串連            SQLiteConnection connection = new SQLiteConnection(_dbName);            if (null == connection)            {                throw new Exception("create db connection failed");            }            return connection;        }        private void CreateTable(SQLiteConnection connection)        {            //建立表            string sql = string.Format("create table if not exists {0} (id integer primary key autoincrement,name text)", _tableName);            using (ISQLiteStatement sqliteStatement = connection.Prepare(sql))            {                //執行語句                sqliteStatement.Step();            }        }        private void InsertRow(SQLiteConnection connection, string name)        {            //插入資料            string sql = string.Format("insert into {0} (name) values (?)", _tableName);            using (ISQLiteStatement sqliteStatement = connection.Prepare(sql))            {                //綁定參數                sqliteStatement.Bind(1, name);                //執行語句                sqliteStatement.Step();            }        }        private void UpdateRow(SQLiteConnection connection, string newName, string oldName)        {            string sql = string.Format("update {0} set name = ? where name = ?", _tableName);            using (ISQLiteStatement sqliteStatement = connection.Prepare(sql))            {                //綁定參數                sqliteStatement.Bind(1, newName);                sqliteStatement.Bind(2, oldName);                //執行語句                sqliteStatement.Step();            }        }        private void DeleteRow(SQLiteConnection connection, string name)        {            string sql = string.Format("delete from {0} where name = ?", _tableName);            using (ISQLiteStatement sqliteStatement = connection.Prepare(sql))            {                //綁定參數                sqliteStatement.Bind(1, name);                //執行語句                sqliteStatement.Step();            }        }        public void OnPropertyChanged(string propertyName)        {            //MVVM相依性屬性事件            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));        }        #endregion    }}

MainPage.xaml

<Page    x:Class="CloudTechIot5.MainPage"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:local="using:CloudTechIot5"    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"    mc:Ignorable="d">    <Page.Resources>        <Style TargetType="TextBlock">            <Setter Property="FontSize" Value="50"></Setter>            <Setter Property="FontWeight" Value="Bold"></Setter>            <Setter Property="Foreground" Value="Red"></Setter>            <Setter Property="HorizontalAlignment" Value="Center"></Setter>        </Style>    </Page.Resources>    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Vertical">            <TextBlock Text="[email protected]"/>            <TextBlock Text="{Binding Result, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>        </StackPanel>    </Grid>

4.部署應用

為Raspberry串連電源及網線,等待Windows 10 IoT 系統啟動完成。

在 Visual Studio 2015 的工具列中選擇 Remote Machine 進行調試,IP地址輸入裝置對應地址。點擊運行後應用自動部署到裝置上。

應用部署完成後開始運行,顯示如下介面說明資料庫操作已執行完成。

5.驗證結果

關閉剛才部署的 IoT應用,Win10 IoT預設開啟 FTP服務,開啟FTP用戶端串連IoT裝置(這裡使用的FTP用戶端是FileZilla),從 IoT裝置如下位置下載產生的資料庫檔案。

\Data\Users\DefaultAccount.MINWINPC\AppData\Local\Packages\{Package_Family_Name}\LocalState\{DbName}

 

Package Family Name在 Package.appxmanifest中查看。

在 SQLite官網 http://www.sqlite.org/download.html 下載 sqlite3 tools。

在 CMD中使用 sqlite3 tools 輸入命令 "sqlite3 IoT5DB.sdf" 開啟下載的 SQLite 資料庫檔案。

輸入SQL語句 "select * from users;" 查看錶 users中的資料。

id為1的資料不存在。

id為2的資料name欄位值為IoT-10-19:18:52。

id為3的資料name欄位值為IoT-3。

資料庫中的資料與預期結果一致。

到這裡C#操作 Win10 IoT裝置本地 SQLite資料庫的過程就完成了,如果對代碼有最佳化的建議,歡迎留言或發郵件給我([email protected])。也可以掃描下面的二維碼加我的號查看以前的文章。

項目源碼 GitHub https://github.com/CloudTechx/CloudTechIot 的 CloudTechIot5 目錄下。

Win10 IoT C#開發 1 - Raspberry安裝IoT系統及搭建開發環境 http://www.cnblogs.com/cloudtech/p/5562120.html
Win10 IoT C#開發 2 - 建立基於XAML的UI程式 及 應用的三種部署方法 http://www.cnblogs.com/cloudtech/p/5637983.html
Win10 IoT C#開發 3 - GPIO Pin 控制發光二極體 http://www.cnblogs.com/cloudtech/p/5617902.html
Win10 IoT C#開發 4 - UART 串口通訊 http://www.cnblogs.com/cloudtech/p/5518306.html

Win10 IoT C#開發 5 - 操作 IoT 裝置內嵌 SQLite 資料庫 CURD

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.