Xamarin.Android开发实践(十三)

简介: 原文:Xamarin.Android开发实践(十三) Xamarin.Android之SQLite.NET ORM 一、前言 通过《Xamarin.Android之SQLiteOpenHelper》和《Xamarin.Android之ContentProvider》的 学习,我们已经掌握了如何使用特定于该平台的数据库操作。

原文:Xamarin.Android开发实践(十三)

Xamarin.Android之SQLite.NET ORM

一、前言

通过《Xamarin.Android之SQLiteOpenHelper》《Xamarin.Android之ContentProvider》的 学习,我们已经掌握了如何使用特定于该平台的数据库操作。但是这样却和Xamarin所宣称的跨平台相违背了,因为这样我们就需要针对不同的平台编写不同 的代码,而本章将使用Github上的开源项目SQLite.NET去解决这个问题,从而可以实现跨平台,减少代码的重复。

关于该开源项目请点我

 

二、准备工作

因为这个库很大,而我们只需要其中的一个.cs文件就可以了,所以笔者这里已经封装好了一个库,里面不仅包含了这个库,还包含了可以跨平台的网络连接。

点我下载

因为该库还使用了一个json库,所以读者也一并要下载并引用

点我下载

 

然后新建一个Android Application项目(.net 4.0)并且SDK版本设置为14(Android 4.0),下面我们就可以开始正式学习了。

 

三、正文

 

1.引用命名空间

打开MainActivity类并在顶部加上如下引用

1 using NSCPAndroid.SQLite;

 

 

2.创建一个映射类

有过一定开发经验的人一定会很熟悉ORM,笔者平时用的最多的就是EFCastle Active Record。当然还有很多其他更优秀的框架。不熟悉的人也没有关系,下面我们只是新建一个类,而这个类的结构完全是对应到数据库中的表的。比如笔者在这里创建一个名为Stock的表:

1 [Table("Stock")]
2 public class StockTable 3 { 4 [PrimaryKey, AutoIncrement, Column("_id")] 5 public int Id { get; set; } 6 7 [MaxLength(8)] 8 public string Symbol { get; set; } 9 }

其中我们可以看到Table这个注解属性,含义就是这个类对应到数据库中的表名。 读者不要误认为是依照类名,下面就是两个字段其中关键的就是主键,因为SQLite规定主键必须由自身维护,所以这里我们使用了PrimaryKey注解 属性表示该属性为主键,AutoIncrement表示该主键为自增,最后就是Column表示该字段对应到该表的字段名(名字必须为_id),下面一个 就是我们自己的字段了,笔者使用了MaxLength表示该字段最大可以保存八个字符。

关于更多的注解属性可以看下面的介绍。

[PrimaryKey]:表示该表的主键,只能用于Int类型的属性。

[AutoIncrement]:用于需要自增的属性,每插入一条新数据该字段都会自增,只能用于Int类型。

[Column(name)]:用来表示指定属性对应到表中字段的名称,如果不加该属性则表中的字段名与属性名相同。

[Table(name)]:用来表示指定类对应到数据库中的表名称,如果不加该属性则数据库中的表名称与该类名称相同。

[MaxLength(value)]:用来限制字段能够保存的最长字符长度。

[Ignore]:表示忽略该属性,从而不会在表中生成对应的字段。

[Unique]:表示该属性的值必须在表中唯一。

 

3.创建数据库连接

我们需要指定数据库所保存的路径,同时还要打开该数据库。如果不存在该数据库,则会自动创建该文件。下面的代码我们将获取数据库的路径并打开该数据库:

1 string dbPath = Path.Combine(System.Environment.
2 GetFolderPath(System.Environment.SpecialFolder.Personal),"ormdemo.db3"); 3 var db = new SQLiteConnection(dbPath);

 

这里要注意我们用的是SQLiteConnection打开该数据库的,而不是SqlConnection。成功打开该数据库之后剩下的工作我们只需要利用db就可以轻松完成了,到现在为止我们仅仅创建了一个空的数据库,里面还不存在任何表。

 

4.创建表

第2步我们已经创建好了一个表的结构,下面我们将在数据库中创建对应的表,我们只需要通过下面的代码就可以轻松的创建一个表了:

1 db.CreateTable<StockTable>();

或者下面这个方式也一样可以:

1 db.CreateTable(typeof(StockTable));

创建完之后表还是空的,所以接下来我们需要插入几条数据,这样才能介绍其他的操作。

 

注:实际运用中一定会有人想找如何判断该表是否已经创建的方法,其实没有必须要找,即使重复的执行该操作,也不会影响什么,表一旦创建之后在执行就不会重新创建了。

 

5.插入数据

这里我们直接通过创建StockTable的实例来插入到数据库中,比如下面的代码我们将会插入一条数据:

1 var newStock = new StockTable();
2 newStock.Symbol = "First"; 3 db.Insert(newStock);

是不是十分简单,仅仅只需要调用Insert即可,该方法还会返回插入数据的主键。但是这只是插入一条数据,如果我们需要插入多条数据呢?当然不可能用foreach,已经提供了另一个方法InsertAll,比如下面的示例将会同时插入多条数据:

 1 List<StockTable> stocks = new List<StockTable>
 2 {
 3     new StockTable{  4 Symbol = "First"  5  },  6 new StockTable{  7 Symbol = "Second"  8  }  9 }; 10 db.InsertAll(stocks);

如果读者需要验证下是不是插入了,我们可以获取该表有多少数据即可,比如下面的代码:

1 int count = db.Table<StockTable>().Count();

这时表里已经有数据了,下面我们就需要进行查询。

 

6.查询数据

首先介绍最简单的查询方式,就是依靠id来直接获取。当然我们不需要拼接任何SQL,只需要通过下面这段代码就可以获取id为1的数据了:

1 var item = db.Get<StockTable>(1);

 

 

但是大多数情况下我们都需要通过条件语句进行查询,那样我们就需要使用SQL语句了,比如下面的查询语句,我们将查询Symbol开头为“F”的数据:

1 var items = db.Query<StockTable>(" select * from Stock where Symbol like ? ", "F%");

 

 

相信那些对技术比较追求的人一定知道Linq,它让我们摆脱的拼接SQL语句的尴尬,使得查询变的简单有趣(复杂的查询还是需要采用SQL,甚至是存储过程等),当然在这里我们依然可以使用这一特性,下面我们将上面的代码改写成Linq

1 var items = (from item in db.Table<StockTable>()
2 where item.Symbol.StartsWith("F") 3 select item).GetEnumerator();

笔者为了能够更快的查看结果,所以使用了GetEnumerator,实际使用中不一定需要。如果读者喜欢最原始的查询可以用ExecuteScalar方法。

 

注:linq的查询是属于延迟查询的,意味着在查询的那一刻并没有把结果查询出来,而是等待你使用它的时候才查询。

 

推荐:

1.Jesse Liu的随笔《快乐的lambda表达式》,个人感觉很有意思,也很有用。

2.关于Linq如何实现动态查询的文章点我,动态查询可以认为是用字符串拼接Linq的部分语句,这样做的目的是为了解决某些特殊场合下的使用。

关于查询数据到此结束了,下面我们将学习剩下的两个操作分别是更新和删除。

 

7.更新和删除数据

首先我们先将更新数据,因为它的操作跟插入数据是一样的存在UpdateUpdateAll,只是数据的主键需要有数据,否则无法定位是更新哪个数据,下面我们将演示如何利用Update更新数据:

1 var result = (from item in db.Table<StockTable>()
2 where item.Symbol.StartsWith("F") 3 select item).First(); 4 result.Symbol = "Third"; 5 db.Update(result); 6 7 result = db.Get<StockTable>(result.Id);

既然是更新当然需要先获取一条数据然后更新,最后还要从数据库中拿出来,确定是否已经更新成功。下面我们继续删除操作:

1 var result = (from item in db.Table<StockTable>()
2 where item.Symbol.StartsWith("T") 3 select item).First(); 4 5 db.Delete<StockTable>(result.Id);

如果你需要删除整个表的数据只需要使用DeleteAll即可,当然这些操作都是有限的,所以我们还需要支持SQL的方法,那么我们可以使用Execute即可。

目录
相关文章
|
6天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
19天前
|
Android开发 开发者 Kotlin
探索安卓开发中的新特性
【9月更文挑战第14天】本文将引导你深入理解安卓开发领域的一些最新特性,并为你提供实用的代码示例。无论你是初学者还是经验丰富的开发者,这篇文章都会给你带来新的启示和灵感。让我们一起探索吧!
|
3天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
18 7
|
6天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
3天前
|
缓存 Java Linux
探索安卓开发:从新手到专家的旅程
【9月更文挑战第30天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索安卓开发的广阔世界。无论你是刚入门的新手,还是希望提升技能的开发者,本文都将为你提供宝贵的知识和指导。我们将深入探讨安卓开发的基础知识、关键概念、实用工具和最佳实践,帮助你在安卓开发领域取得更大的成功。让我们一起开启这段精彩的旅程吧!
|
4天前
|
监控 安全 Java
Kotlin 在公司上网监控中的安卓开发应用
在数字化办公环境中,公司对员工上网行为的监控日益重要。Kotlin 作为一种基于 JVM 的编程语言,具备简洁、安全、高效的特性,已成为安卓开发的首选语言之一。通过网络请求拦截,Kotlin 可实现网址监控、访问时间记录等功能,满足公司上网监控需求。其简洁性有助于快速构建强大的监控应用,并便于后续维护与扩展。因此,Kotlin 在安卓上网监控应用开发中展现出广阔前景。
9 1
|
7天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
|
14天前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
38 10
|
8天前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
|
16天前
|
Java Linux Android开发
深入理解Android开发:从基础到高级
【9月更文挑战第17天】本文将深入探讨Android开发的各个方面,包括应用开发、操作系统等。我们将通过代码示例来展示如何创建一个简单的Android应用,并解释其背后的原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。