uwp连接mysql数据库_在 UWP 应用中使用 SQLite 数据库

在 UWP 应用中使用 SQLite 数据库Use a SQLite database in a UWP app

06/26/2020

本文内容

可以使用 SQLite 在用户设备上的轻量级数据库中存储和检索数据。You can use SQLite to store and retrieve data in a light-weight database on the user's device. 本指南演示如何执行该操作。This guide shows you how.

使用 SQLite 进行本地存储一些好处Some benefits of using SQLite for local storage

✔️SQLite 具有轻量和独立的特点。SQLite is light-weight and self-contained. 它是没有其他任何依赖项的代码库。It's a code library without any other dependencies. 无需进行任何配置。There's nothing to configure.

✔️没有数据库服务器。There's no database server. 客户端和服务器在同一进程中运行。The client and the server run in the same process.

✔️SQLite 位于公共域中,因此你可以自由地使用它并将它与应用一起分配。SQLite is in the public domain so you can freely use and distribute it with your app.

✔️SQLite 可跨平台和体系结构工作。SQLite works across platforms and architectures.

可在此处了解有关 SQLite 的详细信息。You can read more about SQLite here.

选择抽象层Choose an abstraction layer

我们建议使用由 Microsoft 构建的 Entity Framework Core 或开源 SQLite 库。We recommend that you use either the Entity Framework Core or the open-source SQLite library built by Microsoft.

Entity Framework CoreEntity Framework Core

Entity Framework (EF) 是一个对象关系映射程序,可用于使用特定于域的对象处理关系数据。Entity Framework (EF) is an object-relational mapper that you can use to work with relational data by using domain-specific objects. 如果已使用此框架处理其他 .NET 应用中的数据,则可以将该代码迁移到 UWP 应用,它将处理对连接字符串的相应更改。If you've already used this framework to work with data in other .NET apps, you can migrate that code to a UWP app and it will work with appropriate changes to the connection string.

SQLite 库SQLite library

The Microsoft.Data.Sqlite library implements the interfaces in the System.Data.Common namespace. Microsoft 将主动保留这些实现,它们提供了围绕低级别本机 SQLite API 的直观的包装器。Microsoft actively maintains these implementations, and they provide an intuitive wrapper around the low-level native SQLite API.

本指南的其余部分将帮助你使用此库。The rest of this guide helps you to use this library.

将解决方案设置为使用 Microsoft.Data.SQlite 库Set up your solution to use the Microsoft.Data.SQlite library

我们将从基本 UWP 项目入手,添加类库,然后安装合适的 Nuget 包。We'll start with a basic UWP project, add a class library, and then install the appropriate Nuget packages.

添加到解决方案的类库的类型以及安装的特定程序包取决于应用面向的最低版本的 Windows SDK。The type of class library that you add to your solution, and the specific packages that you install depends on the minimum version of the Windows SDK that your app targets. 可以在 UWP 项目的属性页中找到该信息。You can find that information in the properties page of your UWP project.

aa11b4b03c585edb2fcdb81e83eb196f.png

根据 UWP 项目面向的最低版本的 Windows SDK,使用以下章节之一。Use one of the following sections depending on the minimum version of the Windows SDK that your UWP project targets.

项目的最低版本没有将 Fall Creators Update 作为目标The minimum version of your project does not target the Fall Creators Update

如果使用的是 Visual Studio 2015,请单击“帮助”->“关于 Microsoft Visual Studio”。If you're using Visual Studio 2015, click Help->About Microsoft Visual Studio. 然后,在已安装程序的列表中,确保你具有 NuGet 包管理器版本 3.5 或更高版本。Then in the list of installed programs, make sure that you have NuGet package manager version of 3.5 or higher. 如果版本号较低,请安装此处提供的更高版本的 NuGet。If your version number is lower than that, install a later version of NuGet here. 在该页面上,你将发现所有版本的 Nuget 都在 Visual Studio 2015 标题下方列出。On that page, you'll find all of the versions of Nuget listed beneath the Visual Studio 2015 heading.

接下来,将类库添加到解决方案。Next, add class library to your solution. 你不必使用类库来包含你的数据访问代码,但我们会使用一个我们的示例。You don't have to use a class library to contain your data access code, but we'll use one our example. 我们将库命名为 DataAccessLibrary,并将库中的类命名为 DataAccess。We'll name the library DataAccessLibrary and we'll name the class in the library to DataAccess.

c6cb361ce1e7cf28cb82eece289e78aa.png

右键单击该解决方法,然后单击“管理解决方案的 NuGet 包”。Right-click the solution, and then click Manage NuGet Packages for Solution.

aac30db9a811ec7ba1ef3b76361f5b82.png

如果使用的是 Visual Studio 2015,请选择“已安装”选项卡,并确保 Microsoft.NETCore.UniversalWindowsPlatform 程序包的版本号为 5.2.2 或更高。If you're using Visual Studio 2015, Choose the Installed tab, and make sure that the version number of the Microsoft.NETCore.UniversalWindowsPlatform package is 5.2.2 or higher.

e99df59c688c317a9b14766935ab3e3b.png

如果不是,请将包更新到更新的版本。If it isn't, update the package to a newer version.

选择“浏览”选项卡,然后搜索“Microsoft.Data.SQLite”程序包。Choose the Browse tab, and search for the Microsoft.Data.SQLite package. 安装该程序包的版本 1.1.1(或更低)。Install version 1.1.1 (or lower) of that package.

82306b366d65aac03b935c1c4c42066a.png

你最低版本的项目已锁定 Fall Creators UpdateThe minimum version of your project targets the Fall Creators Update

将 UWP 项目的最低版本升级到 Fall Creators Update 有几个好处。There's a couple of benefits to raising the minimum version of your UWP project to the Fall Creators update.

首先,你可以使用 .NET Standard 2.0 库而不是常规的类库。First off, you can use .NET Standard 2.0 libraries instead of regular class libraries. 这意味着你可以将数据访问代码与任何其他基于 .NET 的应用(如 WPF、Windows 窗体、Android、iOS 或 ASP.NET 应用)共享。That means that you can share your data access code with any other .NET-based app such as a WPF, Windows Forms, Android, iOS, or ASP.NET app.

其次,应用不需将 SQLite 库打包。Secondly, your app does not have to package SQLite libraries. 相反,应用可以使用随 Windows 一起安装的 SQLite 版本。Instead, your app can use the version of SQLite that comes installed with Windows. 这将带来几个方面的好处。This helps you in a few ways.

✔️减小了应用程序的大小,因为你不必下载 SQLite 二进制文件然后将其打包为应用程序的一部分。Reduces the size of your application because you don't have to download the SQLite binary, and then package it as part of your application.

✔️如果 SQLite 发布了针对 SQLite 中的 bug 和安全漏洞的重要修复程序,你就不必向用户推送你的应用的新版本。Prevents you from having to push a new version of your app to users in the event that SQLite publishes critical fixes to bugs and security vulnerabilities in SQLite. Windows 版本的 SQLite 由 Microsoft 与 SQLite.org 协作维护。The Windows version of SQLite is maintained by Microsoft in coordination with SQLite.org.

✔️应用加载时间可能更短,因为 SDK 版本的 SQLite 很有可能已被加载到内存中。App load time has the potential to be faster because most likely, the SDK version of SQLite will already be loaded into memory.

让我们开始向你的解决方案添加 .NET Standard 2.0 类库。Lets start by adding a .NET Standard 2.0 class library to your solution. 你不必使用类库来包含你的数据访问代码,但我们会使用一个我们的示例。It's not necessary that you use a class library to contain your data access code, but we'll use one our example. 我们将库命名为 DataAccessLibrary,并将库中的类命名为 DataAccess。We'll name the library DataAccessLibrary and we'll name the class in the library to DataAccess.

34eec2ea0e16892f66596fbb272fa8d4.png

右键单击该解决方法,然后单击“管理解决方案的 NuGet 包”。Right-click the solution, and then click Manage NuGet Packages for Solution.

4a13f38b316d5632fe669cb6eae60ca4.png

备注

如果希望 .NET Standard 类库能够访问 UWP 应用的应用文件夹和图像资产,则需要将其标记为其属性中的 EmbeddedResource 和 CopyAlways 。If you want your .NET Standard class library to be able to access app folders and image assets of your UWP app, you will need to mark it as EmbeddedResource and CopyAlways in its properties.

此时,你已经有一个选择。At this point, you have a choice. 你可以使用 Windows 附带的 SQLite 版本,如果你出于某种原因要使用特定版本的 SQLite,则可以在程序中包含 SQLite 库。You can use the version of SQLite that is included with Windows or if you have some reason to use a specific version of SQLite, you can include the SQLite library in your package.

让我们开始演示如何使用 Windows 附带的 SQLite 版本。Let's start with how you use the version of SQLite that included with Windows.

使用随 Windows 一起安装的 SQLite 版本To use the version of SQLite that is installed with Windows

选择“浏览”选项卡,搜索“Microsoft.Data.SQLite.core”程序包,然后安装它。Choose the Browse tab, and search for the Microsoft.Data.SQLite.core package, and then install it.

0e8d297a9ccaa24cff4ae809494fd59a.png

搜索“SQLitePCLRaw.bundle_winsqlite3”程序包,然后仅将它安装到应用程序中的 UWP 项目。Search for the SQLitePCLRaw.bundle_winsqlite3 package, and then install it only to the UWP project in your solution.

255667db5f3e9a1a13f744bb6473dc52.png

将 SQLite 包含在你的应用中To include SQLite with your app

你不必执行此操作。You don't have to do this. 但如果你出于某种原因要将特定版本的 SQLite 包含在你的应用中,请选择“浏览”选项卡,然后搜索“Microsoft.Data.SQLite”程序包。But if you have a reason to include a specific version of SQLite with your app, choose the Browse tab, and search for the Microsoft.Data.SQLite package. 安装该程序包的版本 2.0(或更低)。Install version 2.0 (or lower) of that package.

0289d3116b18669f6219543409a8a2ab.png

在 SQLite 数据库中添加和检索数据Add and retrieve data in a SQLite database

我们将执行以下操作:We'll do these things:

1️⃣准备数据访问类。Prepare the data access class.

2️⃣初始化 SQLite 数据库。Initialize the SQLite database.

3️⃣将数据插入到 SQLite 数据库。Insert data into the SQLite database.

4️⃣从 SQLite 数据库检索数据。Retrieve data from the SQLite database.

5️⃣添加基本用户界面。Add a basic user interface.

准备数据访问类Prepare the data access class

从 UWP 项目中,添加对解决方案中的 DataAccessLibrary 项目的引用。From your UWP project, add a reference to the DataAccessLibrary project in your solution.

1218cc74ec53b5d314661e26c110a06c.png

在 UWP 项目中,将以下 using 语句添加到 App.xaml.cs 和 MainPage.xaml.cs 文件。Add the following using statement to the App.xaml.cs and MainPage.xaml.cs files in your UWP project.

using DataAccessLibrary;

在 DataAccessLibrary 解决方案中打开 DataAccess 类并将其设为静态。Open the DataAccess class in your DataAccessLibrary solution and make that class static.

备注

尽管我们的示例将数据访问代码放在静态类中,但这只是一个设计选择,并且是全凭自愿。While our example will place data access code in a static class, it's just a design choice and is completely optional.

namespace DataAccessLibrary

{

public static class DataAccess

{

}

}

将以下 using 语句添加到此文件顶部。Add the following using statements to the top of this file.

using Microsoft.Data.Sqlite;

using System.Collections.Generic;

初始化 SQLite 数据库Initialize the SQLite database

向 DataAccess 类添加一个初始化 SQLite 数据库的方法。Add a method to the DataAccess class that initializes the SQLite database.

public async static void InitializeDatabase()

{

await ApplicationData.Current.LocalFolder.CreateFileAsync("sqliteSample.db", CreationCollisionOption.OpenIfExists);

string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");

using (SqliteConnection db =

new SqliteConnection($"Filename={dbpath}"))

{

db.Open();

String tableCommand = "CREATE TABLE IF NOT " +

"EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +

"Text_Entry NVARCHAR(2048) NULL)";

SqliteCommand createTable = new SqliteCommand(tableCommand, db);

createTable.ExecuteReader();

}

}

此代码将创建 SQLite 数据库并将其存储在应用程序的本地数据存储区中。This code creates the SQLite database and stores it in the application's local data store.

在此示例中,我们将数据库命名为 sqlliteSample.db,但你可以使用任何想要的名称,只要你在你实例化的所有 SqliteConnection 对象中使用该名称。In this example, we name the database sqlliteSample.db but you can use whatever name you want as long as you use that name in all SqliteConnection objects that you instantiate.

在 UWP 项目的 App.xaml.cs 文件的构造函数中,调用 DataAccess 类的 InitializeDatabase 方法。In the constructor of the App.xaml.cs file of your UWP project, call the InitializeDatabase method of the DataAccess class.

public App()

{

this.InitializeComponent();

this.Suspending += OnSuspending;

DataAccess.InitializeDatabase();

}

将数据插入到 SQLite 数据库Insert data into the SQLite database

向 DataAccess 类添加一个将数据插入到 SQLite 数据库的方法。Add a method to the DataAccess class that inserts data into the SQLite database. 此代码在查询中使用参数以阻止 SQL 注入攻击。This code uses parameters in the query to prevent SQL injection attacks.

public static void AddData(string inputText)

{

string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");

using (SqliteConnection db =

new SqliteConnection($"Filename={dbpath}"))

{

db.Open();

SqliteCommand insertCommand = new SqliteCommand();

insertCommand.Connection = db;

// Use parameterized query to prevent SQL injection attacks

insertCommand.CommandText = "INSERT INTO MyTable VALUES (NULL, @Entry);";

insertCommand.Parameters.AddWithValue("@Entry", inputText);

insertCommand.ExecuteReader();

db.Close();

}

}

从 SQLite 数据库检索数据Retrieve data from the SQLite database

添加从 SQLite 数据库获取数据行的方法。Add a method that gets rows of data from a SQLite database.

public static List GetData()

{

List entries = new List();

string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");

using (SqliteConnection db =

new SqliteConnection($"Filename={dbpath}"))

{

db.Open();

SqliteCommand selectCommand = new SqliteCommand

("SELECT Text_Entry from MyTable", db);

SqliteDataReader query = selectCommand.ExecuteReader();

while (query.Read())

{

entries.Add(query.GetString(0));

}

db.Close();

}

return entries;

}

Read 方法将向前浏览返回的数据的行。The Read method advances through the rows of returned data. 如果有剩下的行,它将返回 true,否则返回 false。It returns true if there are rows left, otherwise it returns false.

GetString 方法返回字符串形式的指定列的值。The GetString method returns the value of the specified column as a string. 它将接受一个整数值,该值表示所需的数据的从零开始的列序号。It accepts an integer value that represents the zero-based column ordinal of the data that you want. You can use similar methods such as GetDataTime and GetBoolean. 请根据列包含的数据的类型选择方法。Choose a method based on what type of data the column contains.

在此例子中,序号参数并不重要,因为我们选择了单个列中的所有条目。The ordinal parameter isn't as important in this example because we are selecting all of the entries in a single column. 但是,如果多个列是你的查询的一部分,请使用序号值获取你要从中拉取数据的列。However, if multiple columns are part of your query, use the ordinal value to obtain the column you want to pull data from.

添加基本用户界面Add a basic user interface

在 UWP 项目的 MainPage.xaml 文件中,添加以下 XAML。In the MainPage.xaml file of the UWP project, add the following XAML.

Add

此基本用户界面为用户提供了 TextBox,可用于键入我们将添加到 SQLite 数据库的字符串。This basic user interface gives the user a TextBox that they can use to type a string that we'll add to the SQLite database. 我们要将此 UI 中的 Button 连接到事件处理程序,后者将从 SQLite 数据库检索数据然后在 ListView 中显示数据。We'll connect the Button in this UI to an event handler that will retrieve data from the SQLite database and then show that data in the ListView.

在 MainPage.xaml.cs 文件中,添加以下处理程序。In the MainPage.xaml.cs file, add the following handler. 这是我们关联到 UI 中的 Button 的 Click事件的方法。This is the method that we associated with the Click event of the Button in the UI.

private void AddData(object sender, RoutedEventArgs e)

{

DataAccess.AddData(Input_Box.Text);

Output.ItemsSource = DataAccess.GetData();

}

完成了。That's it. 探索 Microsoft.Data.Sqlite 以了解 SQLite 数据库的其他功能。Explore the Microsoft.Data.Sqlite to see what other things you can do with your SQLite database. 查看下面的链接,了解在 UWP 应用中使用数据的其他方法。Check out the links below to learn about other ways to use data in your UWP app.

后续步骤Next steps

将应用直接连接到 SQL Server 数据库Connect your app directly to a SQL Server database

在跨不同平台的不同应用之间共享代码Share code between different apps across different platforms

使用 Azure SQL 后端添加大纲/细节页面Add master detail pages with Azure SQL back ends

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 的实时性能监控利器

操作系统及MySQL数据库的实时性能状态数据尤为重要,特别是在有性能抖动的时候,这些实时的性能数据可以快速帮助你定位系统或MySQL数据库的性能瓶颈,就像你在Linux系统上使用「top,sar,iostat」等命令工具一样&#xff…

设置linearlayout最大高度_技术案例 | 排烟口个数与挡烟垂壁高度的关系探讨

随着《建筑防烟排烟系统技术标准》( 以下简称新规范) 的正式实施,新规范对排烟系统的设计提出了完全不同的设计理念。根据新规范正文: 当建筑空间净高不大于6m时,每个防烟分区的排烟量应按不小于60m/(h㎡)计算且不小于15,000m/h( 走道不小于13,000m/h) &…

python安装requests第三方模块

2018-08-28 22:04:51 1 .下载到桌面后解压,放到python的目录下 --------------------------------------------------------------------------------------------------------------------------------------------------------- 2 . 在CMD输入以下 F:\>cd /d F…

集算器协助Java处理结构化文本之条件过滤

直接用Java实现文本文件中数据按条件过滤会有如下的麻烦: 1、文件不是数据库,不能用SQL访问。当过滤条件变化时需要改写代码。如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大。 2、文件太大时不能一…

python3动态加载模块的方法实现

2019独角兽企业重金招聘Python工程师标准>>> 需求 我们有时写了一个功能,需要不断地调整,但是已经在线上了,而且在执行任务, 这时要更新上去源文件,而不能结束掉当前进程,怎么办? 所以这时&…

python 浮点数最小值_PYTHON学习笔记(3)——基本数据类型

本次学习原内容均来自MOOC国家精品课程《Python程序语言设计》嵩天第一篇在问题——“今天python了吗?”中基本数据类型1、 整数(1)整数无限制 pow(x,y) 计算 (2)四种进制 2、 浮点数类型(1)取整…

Windows Azure移动终端云服务管理(公测版)

概览 云在远方,管理在您手中。在这个移动为先 云为先的世界,服务不再是基于请求才提供,而是主动来到身边方便您的模式了。我们最近将会陆续推出几大移动端利器帮助您随时随地管理您的云服务。 首批利器之中排名第一当属Azure云助手应用, 它是…

学习opencv3中文版_给视觉组新生的一点学习建议

如果说机械组是把机器人做出来电控组让机器人动起来那么视觉组就是让机器人智能化完成一个合格的机器人三者缺一不可今天就让我们来看看视觉组师兄推荐的学习建议吧!1语言基础 野狼队视觉组目前使用的主要语言是C,同时也需要具备一定的C语言基础。建议…

如何动态改变audio的播放的src

如何动态改变audio的播放的src 一、总结 一句话总结:js方式在请求外部网站的时候行,php方式在请求内外部资源都行。因为php走在js前面,所以问题可以从php方面想办法。 1、如何使用js控制修改audio的src或它的source 的src属性实现动态改变aud…

mysql 水平拆分实例_2021先定个小目标?搞清楚MyCat分片的两种拆分方法和分片规则!(二):水平拆分实例解析和代码实现!...

一、概述根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。二、案例场景在业务系统中, 有一张表(日志表), 业务系统每天都会产生大量的日志数据 , 单台服务器的数据存储及处理能…

30分钟快速搭建移动应用直传OSS服务

30分钟快速搭建移动应用直传服务 背景 这是一个移动互联的时代。手机APP上传的数据会越来越多。把数据存储的问题交给OSS, 让开发者能更加专注于自己的应用逻辑。 那么怎么样基于OSS构建一个APP存储系统呢? 目的 本教程就是让你在30分钟内搭建一个基于OS…

用java判断一个年份是否为闰年_判断闰年还是平年

↑↑↑点击上方图片&#xff0c;了解详情正文&#xff1a;判断一个年份是闰年还是平年。闰年条件&#xff1a;1.可以被400整除。2.可以被4整除&#xff0c;但是不可以被100整除。代码&#xff1a;Private Sub 查询_Click() If Me.年份 Mod 4 0 And Me.年份 Mod 100 <> 0…

【JavaScript吉光片羽】--- 滑动条

灯光的亮度控制需要一个滑动条&#xff0c;先借用lamp源码中Bar&#xff1a; var Bar function (opt) {var defaults {$id: "", // 进度条dom节点idmin: 1, // 刻度最小值stepCount: 5, // 刻度步数step: 1, // 刻度步长$alpha: "",//显示亮度的idtouchE…

python语言用什么关键字来声明一个类_python使用什么关键字定义类

什么是类&#xff1f; 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 什么是方法&#xff1f; 类中的函数即为方法 如何定义一个类&#xff1f; 定义类&#xff0c;语法格式如下&#xff1a;class ClassName:. . .…

谷歌+安卓,他已经改变了世界两次,但还想多来几次

回望拉里佩奇的创业经历&#xff0c;小巴发现他在几个创业者最有可能犯&#xff08;si&#xff09;错&#xff08;bi&#xff09;的节点上都处理得很好。 你还记得你用的第一个搜索网站是什么吗&#xff1f; Google.com 讲到它的创始人&#xff0c;一般要连起来念&#xff0c; …

一张图看懂单机/集群/热备/磁盘阵列(RAID)

单机部署(Standalone) 只有一个饮水机提供服务器&#xff0c;服务只部署一份 集群部署(Cluster) 多个饮水机同时提供服务&#xff0c;服务冗余部署&#xff0c;每个冗余的服务都对外提供服务&#xff0c;一个服务挂掉时依然可用 热备部署(Hot-swap) 只有一个桶提供服务&#xf…

typescript vuex_Vue3+TypeScript完整项目上手教程

作者&#xff1a;TinssonTaihttps://juejin.im/post/6875713523968802829一个完整的Vue3Ts项目,支持.vue和.tsx写法 项目地址&#xff1a;https://github.com/vincentzyc/vue3-demo.gitTypeScript 是JS的一个超集&#xff0c;主要提供了类型系统和对ES6的支持&#xff0c;使用 …

一些会用到的知识

为什么80%的码农都做不了架构师&#xff1f;>>> HtmlAgilityPack 用来解析HTML代码 microsoft.mshtml CsQuery 解析HTML代码 转载于:https://my.oschina.net/uwith/blog/813725

python图像对比_用python实现对比两张图片的不同

from PIL import Image from PIL import ImageChops def compare_images(path_one, path_two, diff_save_location): """ 比较图片&#xff0c;如果有不同则生成展示不同的图片 参数一: path_one: 第一张图片的路径 参数二: path_two: 第二张图片的路径 参数三:…

Kafka 分布式环境搭建

这篇文章将介绍如何搭建kafka环境&#xff0c;我们会从单机版开始&#xff0c;然后逐渐往分布式扩展。单机版的搭建官网上就有&#xff0c;比较容易实现&#xff0c;这里我就简单介绍下即可&#xff0c;而分布式的搭建官网却没有描述&#xff0c;我们最终的目的还是用分布式来解…