前言

  Xamarin.Forms支持使用SQLite数据库引擎。本文介绍了Xamarin.Forms应用程序如何读取和写入数据到使用SQLite.Net的本地SQLite数据库。

在Xamarin.Forms项目中引用 SQLite 包

  要使用 SQLite , 我们先要引用 SQLite 的引用包。使用 NuGet 的搜索功能查找sqlite net pcl并安装最新的包:

连接 SQLite 本地数据库并创建数据表

  1. //SQLite 数据库地址
  2. var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "sqlite.db3");
  3. using (SQLiteConnection con = new SQLiteConnection(path))
  4. {
  5.  
  6. }

通过以上代码,创建一个名为 "sqlite.db3" 的 SQLite 本地数据库,并进行连接操作。(本地数据库存在时,直接连接)

可以看到 SQLiteConnection 对象的 DatabasePath 的路径为:/data/user/0/com.companyname.Samples/files/.local/share/sqlite.db3 。至此我们创建本地数据库及连接本地数据库成功!

在本文中主要介绍通过 SQLite.NET ORM 操作数据库。

  1. //SQLite 数据库地址
  2. var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "sqlite.db3");
  3. using (SQLiteConnection con = new SQLiteConnection(path))
  4. {
  5. // ORM方式
  6. con.DropTable<Student>();
  7. con.DropTable<Subject>();
  8. con.DropTable<StudentSubject>();
  9. con.CreateTables<Student, Subject, StudentSubject>();
  10.  
  11. sl.Children.Add(new Label() { Text = "建表完成" });
  12. }

通过 DropTable<T>() 删除表。

通过 CreateTable<T>() 或 CreateTables<T,T,T>() 创建表。

  1. public class Student
  2. {
  3. [PrimaryKey]
  4. public string id { get; set; }
  5. public string name { get; set; }
  6. public int age { get; set; }
  7. }
  8.  
  9. public class Subject
  10. {
  11. [PrimaryKey]
  12. public string id { get; set; }
  13. public string name { get; set; }
  14. }
  15.  
  16. public class StudentSubject
  17. {
  18. [PrimaryKey]
  19. public string id { get; set; }
  20. public string student_id { get; set; }
  21. public string subject_id { get; set; }
  22. }

在类 Student,Subject,StudentSubject 中,通过在属性上标记 [PrimaryKey] 标示 id 列为 主键列。(主键列很重要,在修改,删除操作中会用到)

在 SQLite 本地数据库中 INSERT 数据

  1. var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "sqlite.db3");
  2. using(var con = new SQLiteConnection(path))
  3. {
  4. // ORM方式
  5. var list = new List<object>();
  6. list.Add(new Student() { id = "stu_1", name = "张三", age = });
  7.  
  8. list.Add(new Subject() { id = "subject_1", name = "计算机" });
  9. list.Add(new Subject() { id = "subject_2", name = "数学" });
  10. list.Add(new Subject() { id = "subject_3", name = "英语" });
  11.  
  12. list.Add(new StudentSubject() { id = "ss_1", student_id = "stu_1", subject_id = "subject_1" });
  13. list.Add(new StudentSubject() { id = "ss_2", student_id = "stu_1", subject_id = "subject_2" });
  14. list.Add(new StudentSubject() { id = "ss_3", student_id = "stu_1", subject_id = "subject_3" });
  15.  
  16. var result = con.InsertAll(list);
  17.  
  18. sl.Children.Add(new Label() { Text = result > ? "插入成功" : "插入失败" });
  19. }

通过 Insert(Object object) 或 InsertAll(IEnumerable objects) 或 Execute(string query, params object[] args) 进行 新增操作;

在 SQLite 本地数据库中 SELECT 数据

  1. var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "sqlite.db3");
  2. using (var con = new SQLiteConnection(path))
  3. {
  4. // ORM方式
  5. // var student = con.Table<Student>().FirstOrDefault();
  6. // SQL语句方式
  7. var student = con.Query<Student>("SELECT id,name,age FROM Student LIMIT 0,1;").FirstOrDefault();
  8.  
  9. // ORM方式
  10. // var studentSubjects = con.Table<StudentSubject>().ToList();
  11. // SQL语句方式
  12. var studentSubjects = con.Query<StudentSubject>("SELECT student_id,subject_id FROM StudentSubject;").ToList();
  13.  
  14. if (student == null)
  15. {
  16. sl.Children.Add(new Label() { Text = "无数据" });
  17. return;
  18. }
  19.  
  20. sl.Children.Add(new Label() { Text = string.Format("student.id = {0}", student.id) });
  21. sl.Children.Add(new Label() { Text = string.Format("student.name = {0}", student.name) });
  22. sl.Children.Add(new Label() { Text = string.Format("student.age = {0}", student.age) });
  23.  
  24. studentSubjects.ForEach(ss =>
  25. {
  26. // ORM方式
  27. // var subject = con.Table<Subject>().Where(o => o.id.Equals(ss.subject_id)).FirstOrDefault();
  28. // SQL语句方式
  29. var subject = con.Query<Subject>("SELECT * FROM Subject WHERE id = ?", new object[] { ss.subject_id }).FirstOrDefault();
  30.  
  31. sl.Children.Add(new Label() { Text = string.Format("student.subject = {0}", subject.name) });
  32. });
  33. }

通过 Query<T>(string query, params object[] args) 或 TableQuery<T> Table<T>() 进行 查询操作;

在 SQLite 本地数据库中 UPDATE 数据

  1. var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "sqlite.db3");
  2. using (var con = new SQLiteConnection(path))
  3. {
  4. // ORM方式
  5. var student = con.Table<Student>().FirstOrDefault();
  6. if (student == null)
  7. {
  8. sl.Children.Add(new Label() { Text = "无数据" });
  9. return;
  10. }
  11.  
  12. student.name = "我是修改后的姓名";
  13. var result = con.Update(student);
  14.  
  15. sl.Children.Add(new Label() { Text = result > ? "修改成功" : "修改失败" });
  16. }

通过 Update(object obj) 或 Execute(string query, params object[] args) 进行 修改操作;

在 SQLite 本地数据库中 DELETE 数据

  1. var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "sqlite.db3");
  2. using (var con = new SQLiteConnection(path))
  3. {
  4. var student = con.Table<Student>().FirstOrDefault();
  5. if (student == null)
  6. {
  7. sl.Children.Add(new Label() { Text = "无数据" });
  8. return;
  9. }
  10.  
  11. // ORM方式
  12. // var result = con.Delete(student);
  13. // SQL语句方式
  14. var result = con.Execute("DELETE FROM Student WHERE id = ?", new object[] { student.id });
  15.  
  16. sl.Children.Add(new Label() { Text = result > ? "删除成功" : "删除失败" });
  17. }

通过 Delete<T>(object primaryKey) 或 Execute(string query, params object[] args) 进行 删除操作;

结束语

本文所有代码都在 https://github.com/hexu6788/XamarinForms-Samples

如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。

如果你对 .NET 或 Xamarin 有兴趣的话可以关注我,我会定期的在博客分享我的学习心得。

本文地址:https://www.cnblogs.com/hexu6788/p/10102942.html

作者博客:何旭

欢迎转载,请在明显位置给出出处及链接

Xamarin.Forms 使用本地数据库之 SQLite的更多相关文章

  1. (转)HTML5 本地数据库(SQLite) 示例

      HTML5 本地数据库(SQLite) 示例 2012-05-07 16:21:13 标签:SQLite HTML5本地数据库 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作 ...

  2. HTML5本地数据库(SQLite)示例

    本文转载自http://blog.sina.com.cn/s/blog_641cf27f01016pm5.html 按照国内一HTML5先行者的例子仿写了一个用HTML5 API来操作本地SQLite ...

  3. HTML5 本地数据库(SQLite) 示例

    http://supercharles888.blog.51cto.com/609344/856071 http://www.sqlite.org/download.html

  4. 整理 Xamarin.Forms - Plugins

    Open Source Components for Xamarin Xamarin官方整理的一些开源组件,有需要可以先到这里找 GitHub: xamarin/XamarinComponents: ...

  5. Xamarin.Forms学习系列之SQLite

    在App中我们通常不会实时获取服务器数据,会在用户手机中保存历史数据,这个时候就需要用到数据库SQLite,由于微软的封装,在Xamarin中操作SQLite非常简单,类似EF的操作. 1.我们需要在 ...

  6. [转载]Unity3D 游戏引擎之使用C#语言建立本地数据库(SQLITE)

    以前在开发中一直使用IOS源生的数据库,通过传递消息的形式在与Unity3D中进行交互.本文我在详细说说如何使用C#语言来在MAC 操作系统下创建Unity本地数据库,我是C#控哇咔咔--- 首先你需 ...

  7. Xamarin.Android 本地数据库 SQLiteDatabase 操作

    目的:使用 SQLiteDatabase 创建本地数据库.表,并对数据进行增删改查操作. 引用命名空间: using Android.App; using Android.Widget; using ...

  8. QT 创建本地数据库(SQLite数据库)存储数据

    注意:QT自带SQLITE数据库,不需要再安装 1.创建一个包含创建.查询.修改和删除数据库的数据库类(DataBase) DataBase.h头文件 #pragma once #include &l ...

  9. 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选

    在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...

随机推荐

  1. NopCommerce用.net core重写ef

    最近看了NopCommerce源码,用core学习着写了一个项目,修改的地方记录下.项目地址 NopCommerce框架出来好久了.18年的第一季度 懒加载出来后也会全部移动到.net core.那么 ...

  2. python --商品评价---- 数据表结构以及理解

    商品评论(评价)功能 1.概述 评论功能已经成为APP和网站开发中的必备功能.本文主要介绍评论功能的数据库设计. 评论功能最主要的是发表评论和回复评论(删除功能在后台).评论功能的拓展功能体现有以下几 ...

  3. sql server 锁与事务拨云见日(中)

    一.事务的概述 上一章节里,重点讲到了锁,以及锁与事务的关系.离上篇发布时间好几天了,每天利用一点空闲时间还真是要坚持.听<明朝那些事儿>中讲到"人与人最小的差距是聪明,人与人最 ...

  4. Nginx安装echo模块

    echo-nginx-module 模块可以在Nginx中用来输出一些信息,可以用来实现简单接口或者排错. 项目地址:https://github.com/openresty/echo-nginx-m ...

  5. 使用redis进行基于shiro的session集群共享

    之前写过一篇nginx多tomcat负载均衡,主要记录了使用nginx对多个tomcat 进行负载均衡,其实进行负载均衡之前还有一个问题没有解决,那就是集群间的session共享,不然用户在登录网站之 ...

  6. https跨域到http问题解决

    整体结构 用户--https-->Nginx--http-->Tomcat 页面中包含了iframe,iframe的src也是Https的,但是当frame里面的内容表单提交后tomcat ...

  7. Gradle nexus 解决开发机器不连网无法下载gradle插件问题

    在用gradle时常规配置如下(D:\gradle-4.9\init.d\init.gradle文件,没有这个文件时自建): ext { nexus = 'http://192.168.127.128 ...

  8. man exportfs(exportfs命令中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html exportfs() System Manager's Manual exportfs ...

  9. Perl文件测试操作和stat函数

    在shell中通过test命令或者中括号[]可以进行文件测试以及其它类型的测试,例如判断文件是否存在,比较操作是否为真等等.perl作为更强大的文本处理语言,它也有文件测试类表达式,而且和shell的 ...

  10. C#委托。

    什么是委托. 委托是一种数据类型. 委托的作用. 把变化的东西封装起来. 委托是引用变量,声明后不赋值为null   所以使用前校验非空. class Program { static void Ma ...