Hololens开发(2) UWP程序访问SQLite数据库

参考:

 (http://blog.csdn.net/github_36704374/article/details/60469324)

开发环境

软件:VS2017,硬件:Hololens

需求:将SQLServer数据库转换成SQLlite文件,并通过Hololens的UWP程序访问,读取数据并显示。

原本打算直接上Unity的,但是当前还没装好,先用UWP预习一下。

1.转换数据库

1.下载转换工具,我找到的是SqlConverter_v1_20。(http://download.csdn.net/download/lifeilin6671/7837465)

2.转换数据库,生成文件topviewxp.db。

3.在一般程序中确认生成的文件是否正确(省略,直接上UWP)

2.创建UWP程序

1.用VS2017创建通用程序

2.SQLite操作

参考:http://blog.csdn.net/github_36704374/article/details/60469324

sqlite程序集是到官网下载安装的,在VS中下载的安装不了,说是兼容性问题。

http://sqlite.org/download.html  Universal Windows Platform

3.导入SQLite文件

将生成的topviewxp.db放到项目中,并用StorageFile的copy方法复制到ApplicationData.Current.LocalFolder下,以备后用。

4.读取SQLite内容

1.读取表格列表。

这一步就卡住了,没有直接的参考资料,SQLite.NET.PCL中没找到直接获取的API。一般其实没必要获取表格列表的,直接根据表名获取表的内容就好。不过应该我以前用c#操作SQLite是能获取的,用SQLiteConnection.GetSchema(),SQLiteConnection.GetSchema()稍微研究一下。

SQLiteConnection获取内容的方式是根据表的内容定义一个类,直接映射到类中,但问题是类名和类结果不知道的情况下怎么办呢?

1.获取表结果,创建一个wpf项目,用System.Data.SQLite读取表结果,然后创建类,看能否映射到该类中。

这里卡了一下,由于System.Data.SQLite.dll是32位的,电脑是64位,默认创建的项目是any cpu,导致无法使用dll,改成x86就好了。

SQLiteConnection.GetSchema()的结果,可以看出是数据库中的基本元素的列表。

Hololens开发(2) UWP程序访问SQLite数据库_第1张图片

SQLiteConnection.GetSchema("TABLES")的结果,这里就是全部的表了。

Hololens开发(2) UWP程序访问SQLite数据库_第2张图片

创建了一个MetaDataCollections类

public class MetaDataCollections
    {
        public string CollectionName { get; set; }
        public string NumberOfRestrictions { get; set; }
        public string NumberOfIndentifierParts { get; set; }
    }

结果

Hololens开发(2) UWP程序访问SQLite数据库_第3张图片

创建了一个Tables类,结果一样,没有该表。奇怪,同一个文件,用System.Data.SQLite.dll能读取的话,这些信息应该是就在文件中的。

试着用notepad++打开.db文件,发现用代码创建的db文件中居然有部分明文:

Hololens开发(2) UWP程序访问SQLite数据库_第4张图片

不过用工具转换的文件中没有类似的。嘛,当然不能直接读文本文件了。

这部分先到这里吧,以后有空研究一下SQLite的源码,说不定会有所收获。


2.获取一张表的内容

根据已知的表名,能够获取表的列的列表。

List columns=db.GetTableInfo("T_MachineRoomInfo");
                    CbColumnList.ItemsSource = columns;

3.获取表内容

根据已知的表结果构建一个表类,并获取数据

public class T_MachineRoomInfo
    {
        public string RoomID { get; set; }
        public string RoomName { get; set; }
        public string PID { get; set; }
        public string ImageName { get; set; }
        public string ImageText { get; set; }
        public string Remark { get; set; }
        public string Cli { get; set; }

        public string OptimumPercent { get; set; }
        public string Obligate3 { get; set; }
        public string Obligate4 { get; set; }
        public string Obligate5 { get; set; }
    }

                StringBuilder sb = new StringBuilder();
                using (SQLiteConnection db = new SQLiteConnection(new SQLitePlatformWinRT(), path))
                {
                    var list = db.Table();
                    foreach (var item in list)
                    {
                        sb.AppendLine($"{item.RoomName}");
                    }
                }
                await new MessageDialog(sb.ToString()).ShowAsync();

其实到这里就算是可行性分析完成了,能读取到数据。但是手工生成比较花时间,一个表一个类,这部分可能要用EF框架了。然后还要和以前的类结构对接起来。这两部分其实和UWP本身没关系,在一般的c#项目中就能处理,之后再研究。

3.在Hololens中运行,结果弹出 System.DllNotFoundException:Unable to load DLL 'sqlite3'。只能猜测前面添加的

在hololens上的运行环境中是无效的。

查到一个资料(https://docs.microsoft.com/en-us/windows/uwp/data-access/sqlite-databases)

里面提供了两种途径:

1.Entity Framework Core

2. Microsoft.Data.Sqlite library

先选择Microsoft.Data.Sqlite,从NuGet中安装Microsoft.Data.Sqlite,但是无法使用,点不出来Microsoft命名空间。

到https://github.com/aspnet/Microsoft.Data.Sqlite/下载源代码看看

下载下来后,打开解决方案,引用和NuGet都是感叹号

Hololens开发(2) UWP程序访问SQLite数据库_第5张图片

运行文件夹中的build.cmd(NuGet的某个教程中教的),一开始有错误,仔细看发现目录中中文部分编程乱码,修改目录名称为全英文,另外空格也没有,以防万一。然后就可以正常运行了,应该是下载并安装相关的SDK吧。.NET Core 相关的。

Hololens开发(2) UWP程序访问SQLite数据库_第6张图片

后面又出错了

Hololens开发(2) UWP程序访问SQLite数据库_第7张图片

看到最后一句话,难道是因为我打开了解决方案导致的?关闭再试一次。

可以了,安装成功了!也生成了个Microsoft.Data.Sqlite.dll。

但是怎么用?

将项目中的NuGet的Microsoft.Data.Sqlite卸载,添加对新生成的Microsoft.Data.Sqlite.dll的引用。

可以了!

命名空间能加进来,类能使用了。

但是又有问题

Hololens开发(2) UWP程序访问SQLite数据库_第8张图片

看项目中有个对AspNetCore的引用,在NuGet中找

Hololens开发(2) UWP程序访问SQLite数据库_第9张图片

Hololens开发(2) UWP程序访问SQLite数据库_第10张图片

结果无法安装,另外,NuGet中的Microsoft.Data.Sqlite.Core也是无法安装的。为什么呢?

找standard2.0

.Net Standard

  .Net Standard 库是 .Net Core 可移植性的核心。其目的是定义标准的 API 集。这些 API,如集合、线程、反射,是由 .Net Core、.Net 4.5、Xamarin 和 Mono 等平台实现的。它们是开发人员用来构建自己的库和应用程序的基本构建块。

找到源码了 https://github.com/dotnet/standard

下载并build...又出错了

Hololens开发(2) UWP程序访问SQLite数据库_第11张图片

怀疑是不是我的win10版本问题??

突然想到搜索一下dll,在目录【Microsoft.Data.Sqlite-dev\test\Microsoft.Data.Sqlite.Tests\bin\Debug\net461】下发现一个netstandard.dll,添加引用。有效果!

Hololens开发(2) UWP程序访问SQLite数据库_第12张图片

添加相同目录下的比较相似的 System.Data.Common.dll

Hololens开发(2) UWP程序访问SQLite数据库_第13张图片

这下卡住了!

另一边,Standar源代码build成功了,就是重新build.cmd一次。

找到\standard-master\bin\ref\netstandard\2.0.0.0下面有netstandard.dll,引用进去,不行。

Hololens开发(2) UWP程序访问SQLite数据库_第14张图片

真的卡住了。瞎搞不行啊。

还是想办法从NuGet安装比较合理,相关的程序集也会相应的升级/安装。


4.使用EF框架

这个也在前面的https://docs.microsoft.com/en-us/windows/uwp/data-access/sqlite-databases页面中提到,具体教程在https://docs.microsoft.com/zh-cn/ef/core/get-started/uwp/getting-started,但是需要满足条件

Prerequisites

The following items are required to complete this walkthrough:

  • Windows 10 Fall Creators Update (10.0.16299.0)

  • .NET Core 2.0.0 SDK or later.

  • Visual Studio 2017 version 15.4 or later with the Universal Windows Platform Development workload.

还是要升级系统先,我的是10586,升级显示失败。

5.对接以前的类结构

你可能感兴趣的:(Hololens开发(2) UWP程序访问SQLite数据库)