现代操作系统应用开发:UWP——SQLite数据库实现数据持久化

功能简介

利用SQLite数据库实现数据的持久化,以及对数据项的增、删、改、查,使用SQLite Expert查看数据库内容;博客示例项目包括一个MainPage,MainPage左边有一个ListView,用于显示数据库里的所有数据;右边包括一个搜索界面和修改界面,可以用于对数据库里的内容进行搜索和更新/添加新的数据项;

博客示例项目涉及到一些其他的内容,请确保你对下面内容有所了解再使用(可以参考链接的博客):

实现效果

  • 主界面

  • 数据库保存在LocalFolder中

  • 使用SQLite Expert查看数据库的内容

  • 对数据库内容进行更新

  • 对数据库内容进行搜索

实现过程

环境配置

  • 将SQLite包含到应用包内:工具—>拓展和更新—>联机—>搜索SQLitefor Univeral Windows Platform—>安装

  • 右击项目 “引用” >> 选择 “添加引用” >> 在弹出的窗口左侧栏选择 “Universal Windows” “扩展” >>选择“SQLite for Universal Windows Platform后确定

  • 在引用右键管理NuGet程序包搜索SQLitePCL并安装

  • 最终效果

新建类DBService

DBService类是我们用于数据库管理的类,所有对数据库的操作都要通过DBService来进行

//DBService.cs
namespace SQLiteSample
{
    class DBService
    {
        public DBService()
        {
            //建立连接,如果MySQLite.db不存在,则会新建MySQLite.db
            conn = new SQLiteConnection("MySQLite.db");
            //获取表,如果Items表不存在,则新建表Items
            string sql = @"CREATE TABLE IF NOT EXISTS
                                ITEMS(
                                      ID INTEGER PRIMARY KEY NOT NULL,
                                      TITLE VARCHAR(50),
                                      DETAIL VARCHAR(200)
                                      );";

            using (var statement = conn.Prepare(sql))
            {
                statement.Step();
            }
        }

        private SQLiteConnection conn;

        //一些需要的SQL语句
        private String SQL_DELETE = "DELETE FROM ITEMS" + " WHERE ID = ?";
        private String SQL_UPDATE = "UPDATE ITEMS" + " SET TITLE = ? , DETAIL = ? WHERE ID = ?";
        private String SQL_INSERT = "INSERT INTO ITEMS (TITLE,DETAIL)" + " VALUES(?,?);";
        private String SQL_SELECT_ALL = "SELECT * FROM ITEMS";
        private String SQL_QUERY = "SELECT * FROM ITEMS WHERE TITLE LIKE (?) OR DETAIL LIKE (?);";
        private String SQL_GETID = "SELECT ID FROM ITEMS WHERE TITLE = (?) OR DETAIL = (?);";

        //初始化,获得本地数据库中的所有Item
        internal void Initialize(ObservableCollection<Item> allItems)
        {
            //使用SQL_SELECT_ALL语句获得所有的内容
            using (var statement = conn.Prepare(SQL_SELECT_ALL))
            {
                //statement.Step()将依次获得每一行的结果
                while (SQLiteResult.ROW == statement.Step())
                {
                    int id = int.Parse(statement[0].ToString());
                    string title = (string)statement[1];
                    string detail = (string)statement[2];
                    allItems.Add(new Item(id, title, detail));
                }
            }
        }

        //增
        internal int CreateItem(Item item)
        {
            //往数据库中添加数据
            using (var statement = conn.Prepare(SQL_INSERT))
            {
                //这里的Bind会依次替换掉上面语句中的问号
                statement.Bind(1, item.Title);
                statement.Bind(2, item.Detail);
                statement.Step();
            }
            /*
            * 用于得到之前添加的数据的Id,其实这里的操作不太规范,因为通过title和detail可能相同
            * 不过这里只是为了演示如何使用数据库,就不要太在意这个了,(乛◡乛)
            */
            using (var statement = conn.Prepare(SQL_GETID))
            {
                statement.Bind(1, item.Title);
                statement.Bind(2, item.Detail);
                if (SQLiteResult.ROW == statement.Step())
                {
                    return int.Parse(statement[0].ToString());
                }
            }
            return 0;
        }

        //更新
        internal void UpdateItem(Item item)
        {
            using (var statement = conn.Prepare(SQL_UPDATE))
            {
                statement.Bind(1, item.Title);
                statement.Bind(2, item.Detail);
                statement.Bind(3, item.Id);
                statement.Step();
            }
        }

        //查
        internal async void queryItem(string text)
        {
            //StringBuilder与string的差别是一个可变字符串,在使用上和String差不多
            StringBuilder strB = new StringBuilder();
            using (var statement = conn.Prepare(SQL_QUERY))
            {
                string key = "%" + text + "%";
                statement.Bind(1, key);
                statement.Bind(2, key);
                while (SQLiteResult.ROW == statement.Step())
                {
                    strB.Append("Title: ");
                    strB.Append(statement[1].ToString());
                    strB.Append(" Detail: ");
                    strB.Append(statement[2].ToString());
                    strB.Append("\n");
                }
            }
            MessageDialog searchDialog = new Windows.UI.Popups.MessageDialog(strB.ToString());
            await searchDialog.ShowAsync();
        }

        //删
        internal void DeleteItem(int id)
        {
            using (var statement = conn.Prepare(SQL_DELETE))
            {
                statement.Bind(1, id);
                statement.Step();
            }
        }
    }
}

需要注意的地方:

  • 在构造函数中连接数据库
  • 预先声明的SQL语句
  • statement.Bind()将对SQL里的值进行添值
  • statement.Step()在在数据库中执行该语句

新建Item类

  • 这个类的内容没什么重要的,Item中有三个属性,一个title,一个detail,一个id,对应数据库中一行中的数据;Item类只是为了示例需要,由于篇幅关系,这部分省略,具体代码可以下载下面的示例项目

在MainPage.xaml中添加控件

  • 由于篇幅关系,这部分省略,具体代码可以下载下面的示例项目

在MainPage.xaml.cs的构造函数上添加代码

首先,我们需要添加一个DBServie对象

private DBService itemDBService = new DBService();

然后针对需要只用对应的函数

//列表项初始化
itemDBService.Initialize(allItems);
//增
itemDBService.CreateItem(rightItem);
//删:item.Id为Primary Key
itemDBService.DeleteItem(item.Id);
//查:Query为MainPage的一个文本框,Query.Text得到查询的输入内容
itemDBService.queryItem(Query.Text);
//改
itemDBService.UpdateItem(rightItem);
  • 由于篇幅关系,这部分省略,具体代码可以下载下面的示例项目

总结

整个项目最重要的就是第一步环境配置和第二步DBService类代码的编写,其它的地方就可以通过调用DBService的函数连接数据库啦;

FYI

项目下载:SQLiteSample

运行前首先需要按上面实现过程的第一步配置环境!!!

项目下载之后记住把Debug模式从ARM换成X86或X64(根据你自己的机型选择),之前一开始学习的时候不知道这一点,从网上下载下来的项目都运行不了,纠结的一逼(╥╯^╰╥)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值