Win10手记-为应用集成SQLite(二)

接上篇内容,这里给大家分享我的辅助访问类,采用了异步方法,封装了常用的访问操作,一些操作还是纯CLI的。

SQLiteDBManager

using System;
using System.Collections.Generic;
using System.Collections;
using System.Threading.Tasks;
using SQLite.Net;
using SQLite.Net.Async;
using Windows.Storage;
using System.Diagnostics;
using YunshouyiUWP.Model;

namespace YunshouyiUWP.Data
{
    public class SQLiteDBManager
    {
        private static SQLiteDBManager dbManager;

        /// <summary>
        /// construct function
        /// </summary>
        public SQLiteDBManager()
        {
            InitDBAsync();
        }

        /// <summary>
        /// get current instance
        /// </summary>
        /// <returns></returns>
        public static SQLiteDBManager Instance()
        {
            if (dbManager == null)
                dbManager = new SQLiteDBManager();
            return dbManager;
        }
        private static SQLiteAsyncConnection dbConnection;

        /// <summary>
        /// get current DBConnection
        /// </summary>
        /// <returns></returns>
        public async Task<SQLiteAsyncConnection> GetDbConnectionAsync()
        {
            if (dbConnection == null)
            {
                var path = await GetDBPathAsync();
                dbConnection = new SQLiteAsyncConnection(() => new SQLiteConnectionWithLock(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), new SQLiteConnectionString(path, true)));
            }
            return dbConnection;
        }

        /// <summary>
        /// insert a item
        /// </summary>
        /// <param name="item">item</param>
        /// <returns></returns>
        public async Task<int> InsertAsync(object item)
        {
            try
            {
                var dbConnect = await GetDbConnectionAsync();
                return await dbConnect.InsertOrReplaceAsync(item);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                return -1;
            }

        }

        /// <summary>
        /// insert lots of items
        /// </summary>
        /// <param name="items">items</param>
        /// <returns></returns>
        public async Task<int> InsertAsync(IEnumerable items)
        {
            try
            {
                var dbConnect = await GetDbConnectionAsync();
                return await dbConnect.InsertOrReplaceAllAsync(items);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                return -1;
            }

        }

        /// <summary>
        /// find a item in database
        /// </summary>
        /// <typeparam name="T">type of item</typeparam>
        /// <param name="pk">item</param>
        /// <returns></returns>
        public async Task<T> FindAsync<T>(T pk) where T : class
        {
            try
            {
                var dbConnect = await GetDbConnectionAsync();
                return await dbConnect.FindAsync<T>(pk);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                return null;
            }
        }

        /// <summary>
        /// find a collection of items
        /// </summary>
        /// <typeparam name="T">type of item</typeparam>
        /// <param name="sql">sql command</param>
        /// <param name="parameters">sql command parameters</param>
        /// <returns></returns>
        public async Task<List<T>> FindAsync<T>(string sql, object[] parameters) where T : class
        {
            try
            {
                var dbConnect = await GetDbConnectionAsync();
                return await dbConnect.QueryAsync<T>(sql, parameters);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                return null;
            }
        }

        /// <summary>
        /// update item in table
        /// </summary>
        /// <typeparam name="T">type of item</typeparam>
        /// <param name="item">item</param>
        /// <returns></returns>
        public async Task<int> UpdateAsync<T>(T item) where T : class
        {
            try
            {
                var dbConnect = await GetDbConnectionAsync();
                return await dbConnect.UpdateAsync(item);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                return -1;
            }
        }

        /// <summary>
        /// update lots of items in table
        /// </summary>
        /// <typeparam name="T">type of item</typeparam>
        /// <param name="items">items</param>
        /// <returns></returns>
        public async Task<int> UpdateAsync<T>(IEnumerable items) where T : class
        {
            try
            {
                var dbConnect = await GetDbConnectionAsync();
                return await dbConnect.UpdateAllAsync(items);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                return -1;
            }
        }
        /// <summary>
        /// delete data from table
        /// </summary>
        /// <typeparam name="T">type of item</typeparam>
        /// <param name="item">item</param>
        /// <returns></returns>
        public async Task<int> DeleteAsync<T>(T item) where T : class
        {
            try
            {
                var dbConnect = await GetDbConnectionAsync();
                return await dbConnect.DeleteAsync<T>(item);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                return -1;
            }
        }

        /// <summary>
        /// delete all items in table
        /// </summary>
        /// <param name="t">type of item</param>
        /// <returns></returns>
        public async Task<int> DeleteAsync(Type t)
        {
            try
            {
                var dbConnect = await GetDbConnectionAsync();
                return await dbConnect.DeleteAllAsync(t);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                return -1;
            }
        }
        /// <summary>
        /// get local path in application local folder
        /// </summary>
        /// <returns></returns>
        private async Task<string> GetDBPathAsync()
        {
            var file = await ApplicationData.Current.LocalFolder.GetFileAsync("db.sqlite");
            if (file == null)
            {
                var dbFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Data/db.sqlite"));
                file = await dbFile.CopyAsync(ApplicationData.Current.LocalFolder);
            }

            return file.Path;
        }

        /// <summary>
        /// init db
        /// </summary>
        private static async void InitDBAsync()
        {
            try
            {
                var file = await ApplicationData.Current.LocalFolder.TryGetItemAsync("db.sqlite");
                if (file == null)
                {
                    var dbFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Data/db.sqlite"));
                    file = await dbFile.CopyAsync(ApplicationData.Current.LocalFolder);
                    var dbConnect = new SQLiteAsyncConnection(() => new SQLiteConnectionWithLock(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), new SQLiteConnectionString(file.Path, true)));
                    var result = await dbConnect.CreateTablesAsync(new Type[] { typeof(Fund), typeof(P2P) });
                    Debug.WriteLine(result);
                }

            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);

            }
        }

    }
}

使用方法

以查找数据为例,如下:

public async Task<List<Fund>> GetFundDataAsync()
        {
            var result = await SQLiteDBManager.Instance().FindAsync<Fund>("select * from main where Id=?", new string[] { Guid.NewGuid().ToString() });
            if (result != null)
                return result;
            return null;

        }

初始化数据库时可以一次性创建需要的表,我创建的表如下:

注意事项

1.要为项目引入SQLite.Net.Async-PCL以及VC++ runtime类库,如下:

2.具体操作SQLite方法请查看SQLite.Net项目详细说明,地址如下:

https://github.com/oysteinkrog/SQLite.Net-PCL

时间: 2024-10-28 08:04:33

Win10手记-为应用集成SQLite(二)的相关文章

Win10手记-为应用集成日志工具Logger

日志工具由来已久,是很受大家欢迎的debug工具.其中.NET平台上很出名的是log4net,但是由于Windows 10通用应用项目没有了System.Configuration引用,所以也就不能很好使用log4net工具了. Windows Runtime框架大家从它面世以来一直在吐槽,log4net也因为其缺少api不能使用,但是我们仍然可以找到替代方案.Windows.Foundation.Diagnostics命名空间下就提供了一套简单的日志工具,能够正常使用下去. 方案 根据MSDN

持续集成之二:搭建SVN服务器(subversion)

安装环境 Red Hat Enterprise Linux Server release 7.3 (Maipo) jdk1.7.0_80 subversion-1.10.3.tar.gz apr-1.6.5.tar.gz.apr-util-1.6.1.tar.gz.apr-iconv-1.2.2.tar.gz sqlite-autoconf-3250200.tar.gz Subversion(简称SVN)是一个Apache开源的版本控制系统. svn服务器有2种运行方式:独立服务器和借助apac

持续集成(二)工具搭建篇—内网邮件服务器搭建

在我们的持续构建中,项目构建中出现错误提醒,或者开发人员之间的沟通交流,进度汇报的事务,都是离不开一个通信工具,那就是邮件.在我们的项目开发中如果使用第三方的邮件平台,这肯定不是最好的选择,因为第三方的邮件需要外网的支持,但是外网又不是特别的可靠,假如外网链接出现了问题,这样就会不必要的延误我们的工期.再或者很多项目都是保密项目,在开发中只能用内网.但是不用邮件吧又不行.为了解决这个头疼的问题,我们的内网邮件服务器工具就出现了,只要用它安装在我们的服务器上,配置好账户,配置好客户端,在内网里就可

【Win10 应用开发】集成语音命令

原文:[Win10 应用开发]集成语音命令 记得老周以前在写WP8应用开发的文章时,曾经写过语音命令集成的文章,后来8.1的时候“小娜”问世,但考虑到其变化不大,故老周没有补写相应的文章. 今天,老周打算补一下Win 10通用应用开发中,有关语音命令集成相关的内容.虽然还是一脉相承,大的变化没有,不过Win10 sdk在语音命令定义文件中添加了新内容,而且现在不仅能在手机应用中加入语音集成,在面向PC和板子的应用中也能如愿,因为应用程序已经通用. 同理,在开始之前,老周仍然先给大家讲个故事. 话

使用 IntraWeb (43) - 测试读取 SqLite (二)

一般情况下, 数据源相关控件应该有数据模块中统一管理, 这也方便其他窗体调用; UserSessionUnit 就是一个现成的数据模块. 现在把数据源相关控件放在 UserSessionUnit 的窗体上: FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink; FDGUIxWaitCursor1: TFDGUIxWaitCursor; FDConnection1: TFDConnection; DataSource1: TDataSource; FD

nodejs集成sqlite

正在物色node上面的轻量级嵌入式数据库,作为嵌入式数据库的代表,sqlite无疑是个理想的选择方案.npm上集成sqlite的库主要有两个--sqlite3和realm. realm是一个理想的选择方案,它最初是为移动app设计的,在node也可以运行的,但是不支持Windows系统.sqlite3是一个专为nodejs设计的,在nodejs上面生态更健壮,因此最终选择sqlite3. sqlite3几乎支持所有版本的nodejs,同时也可以和nwjs集成. 安装 基于npm安装 npm in

iOS- 详解如何使用ZBarSDK集成扫描二维码/条形码,点我!

1.前言 目前市场主流APP里,二维码/条形码集成主要分两种表现形式来集成: a. 一种是调用手机摄像头并打开系统照相机全屏去拍摄 b. 一种是自定义照相机视图的frame,自己控制并添加相关扫码指南 今天我就用ZBarSDK来实现上诉两种主流集成方式,与大家共同交流学习/ 2.第一步导入ZBarSDK 可以从github上下载好ZBarSDK,导入项目,并且导入相关iOS.framework 如图: 3.集成扫描二维码/条形码 3.1.调用手机摄像头并打开系统照相机全屏去拍摄 实现效果图: 1

CentOS7与Windows AD集成之二Windows域账户登录CentOS7

上一节我们已经成功将CentOS7加入到Windows域控当中,那么我们是否可以用Windows的域账号直接登录加入域中的CentOS7呢?首先,我们在Windows域控当中新建一个测试账号:sshuser001打开putty,输入CentOS7的IP地址,尝试登录一下 可以看到,Windows的域账号可以成功登录到CentOS7:br/>这里需要注意一下登录时用户名的格式:[email protected] CentOS7与Windows AD集成之二Windows域账户登录CentOS7 原

玩转大数据系列之Apache Pig如何与Apache Solr集成(二)

散仙,在上篇文章中介绍了,如何使用Apache Pig与Lucene集成,还不知道的道友们,可以先看下上篇,熟悉下具体的流程. 在与Lucene集成过程中,我们发现最终还要把生成的Lucene索引,拷贝至本地磁盘,才能提供检索服务,这样以来,比较繁琐,而且有以下几个缺点: (一)在生成索引以及最终能提供正常的服务之前,索引经过多次落地操作,这无疑会给磁盘和网络IO,带来巨大影响 (二)Lucene的Field的配置与其UDF函数的代码耦合性过强,而且提供的配置也比较简单,不太容易满足,灵活多变的