Xamarin.Forms学习系列之SQLite
在App中我们通常不会实时获取服务器数据,会在用户手机中保存历史数据,这个时候就需要用到数据库SQLite,由于微软的封装,在Xamarin中操作SQLite非常简单,类似EF的操作。
1、我们需要在共享项目的nuget中引用 sqlite-net-pcl 和 SQLitePCLRaw.core

2、由于Android和IOS的SQLite数据库存放位置不一样,所以我们需要在共享项目中抽象一个接口ISQLite,然后分别在Android和IOS项目中实现接口,初始化数据库连接
共享项目代码如下:
public interface ISQLite
{
SQLiteAsyncConnection GetAsyncConnection();
}
Android项目代码如下:
[assembly: Xamarin.Forms.Dependency(typeof(SQLiteAndroid))]//注入SQLiteAndroid
namespace Mobile.Droid.Helpers
{
public class SQLiteAndroid : ISQLite
{
private static string path; private static SQLiteAsyncConnection connectionAsync; private static readonly object locker = new object();
private static readonly object pathLocker = new object(); private static string GetDatabasePath()
{
lock (pathLocker)
{
if (path == null)
{
string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // Documents folder
path = Path.Combine(documentsPath, GlobalSetting.SqliteFilename);
}
}
return path;
} public SQLiteAsyncConnection GetAsyncConnection()
{
lock (locker)
{
if (connectionAsync == null)
{
var dbPath = GetDatabasePath();
connectionAsync = new SQLiteAsyncConnection(dbPath);
}
}
return connectionAsync;
}
}
}
IOS项目代码如下:
[assembly: Xamarin.Forms.Dependency(typeof(SQLiteIOS))]
namespace Mobile.iOS.Helpers
{
public class SQLiteIOS : ISQLite
{
private static string path; private static SQLiteAsyncConnection connectionAsync; private static readonly object locker = new object();
private static readonly object pathLocker = new object(); private static string GetDatabasePath()
{
lock (pathLocker)
{
if (path == null)
{
var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // Documents folder
var libraryPath = Path.Combine(documentsPath, "..", "Library"); // Library folder
path = Path.Combine(libraryPath, GlobalSetting.SqliteFilename);
}
}
return path;
} public SQLiteAsyncConnection GetAsyncConnection()
{
lock (locker)
{
if (connectionAsync == null)
{
var dbPath = GetDatabasePath();
connectionAsync = new SQLiteAsyncConnection(dbPath);
}
}
return connectionAsync;
}
}
}
3、在共享项目中创建SqliteHelper
using Microsoft.AppCenter.Crashes;
using Mobile.Interfaces;
using SQLite;
using System;
using Xamarin.Essentials;
using Xamarin.Forms; namespace Mobile.Helpers
{
public class SqliteHelper
{
static SqliteHelper baseSqlite;
public static SqliteHelper Current
{
get { return baseSqlite ?? (baseSqlite = new SqliteHelper()); }
}
public SQLiteAsyncConnection db;
public SqliteHelper()
{
if (db == null)
db = DependencyService.Get<ISQLite>().GetAsyncConnection();
} /// <summary>
/// 创建或者更新Sqlite数据库表
/// 在App启动的时候执行该方法,sqlite-net-pcl会根据实体类创建对应的表,如果实体类有更新,表结构也会更新,如果表结构没变,则不进行操作,sqlite-net-pcl会自动判断
/// </summary>
public async void CreateOrUpdateAllTablesAsync()
{
await db.CreateTablesAsync<TestTable, UserInfo>();
} }
}
4、Sqlite的增删改查操作
public async Task<Model.News> QueryNew(int id)
{
return await db.Table<Model.News>().Where(a => a.Id == id).FirstOrDefaultAsync();
}
public async Task<List<Model.News>> QueryNews(int pageSize)
{
return await db.Table<Model.News>().OrderByDescending(a => a.DateAdded).Skip().Take(pageSize).ToListAsync();
}
public async Task<List<Model.News>> QueryNewsByRecommend(int pageSize)
{
return await db.Table<Model.News>().Where(a => a.IsRecommend).OrderByDescending(a => a.DateAdded).Skip().Take(pageSize).ToListAsync();
}
public async Task<List<Model.News>> QueryNewsByWorkHot(int pageSize, DateTime startdate)
{
return await db.Table<Model.News>().Where(a => a.IsHot && a.DateAdded > startdate).OrderByDescending(a => a.DateAdded).Skip().Take(pageSize).ToListAsync();
}
public async Task UpdateNews(List<Model.News> lists)
{
foreach (var item in lists)
{
await QueryNew(item.Id).ContinueWith(async (results) =>
{
if (results.Result == null)
{
try
{
await db.InsertAsync(item);
}
catch (Exception ex)
{
Crashes.TrackError(ex);
}
}
else
{
await UpdateNew(item);
}
});
}
}
public async Task UpdateNew(Model.News model)
{
try
{
await db.UpdateAsync(model);
}
catch (Exception ex)
{
Crashes.TrackError(ex);
}
}
参考代码: https://github.com/JoesWeek/XamCnblogs
Xamarin.Forms学习系列之SQLite的更多相关文章
- Xamarin.Forms学习系列之Android集成极光推送
一般App都会有消息推送的功能,如果是原生安卓或者IOS集成消息推送很容易,各大推送平台都有相关的Sample,但是关于Xamarin.Forms的消息推送集成的资料非常少,下面就说下Xamarin. ...
- Xamarin.Forms 学习系列之优秀UI收集
1.各种优秀UI例子 https://github.com/jsuarezruiz/xamarin-forms-goodlooking-UI 输入框例子 https://github.com/enis ...
- Xamarin.Forms学习系列之Syncfusion 制作图形报表
Syncfusion是一家微软生态下的第三方组件/控件供应商,除了用于HTML5和JavaScript的控件外,他们产品还涉及如下领域: WEB ASP.NET MVC ASP.NET WebForm ...
- Xamarin.Forms 学习系列之底部tab
App中一般都会有一个底部tab,用于切换不同的功能,在Xamarin中应该制作底部tab了,需要把Android的TabbedPage做一次渲染,IOS的则不用,接下来说下详细步骤: 1.在共享项目 ...
- Xamarin.Forms学习之Platform-specific API和文件操作
这篇文章的分享原由是由于上篇关于Properties的保存不了,调用SavePropertiesAsync()方法也不行,所以我希望通过操作文件的方式保存我的需要的数据,然后我看了一下电子书中的第二十 ...
- Xamarin.Forms学习之Page Navigation(一)
在最初接触Xamarin.Forms的时候,我是跟着Xamarin官方的名为“learning-xamarin-ebook”的pdf文档进行学习的,我在成功运行Hello world程序之后,我开始跟 ...
- Xamarin.Forms学习之XAML命名空间
大家好,我又悄咪咪的来了,在上一篇的Xamarin文章中简单介绍了Xamarin的安装过程,妈蛋没想到很多小朋友很感激我,让他们成功的安装了Xamarin,然后......成功的显示了经典的两个单词( ...
- Xamarin.Forms学习之初
微软的Build 2016结束的有段时间了,对于一个简单的小屌丝程序员--我来说,关注最大的无疑是Xamarin的免费(开源什么的让大神们上吧),内心激动啊.大会结束的周末我就迫不及待的安装了,然后. ...
- Xamarin.Forms学习之位图(二)
上篇文章分享了如何加载网络图片和PCL中的图片,所以今天继续分享关于如何加载平台的内嵌图片,在这之前说一下上篇文章开头的一个问题:为什么不能加载UWP项目,这是因为我升级了UWP的SDK,而Xamar ...
随机推荐
- Xbim.GLTF源码解析(三):Builder类
原创作者:flowell,转载请标明出处:https://www.cnblogs.com/flowell/p/10838706.html IFC提取转换成GLTF的逻辑在Builder类中, Buil ...
- CVE-2019-13272Linuxkernel权限许可和访问控制问题漏洞
漏洞简介: Linuxkernel是美国Linux基金会发布的开源操作系统Linux所使用的内核. Linuxkernel5.1.17之前版本中存在安全漏洞,该漏洞源于kernel/ptrace.c文 ...
- 关于css里大于号(>)的用法
之前用的css没涉及到这个问题,今天看到.知道大概用法,但不知道和普通的后代选择器有什么区别.到网上找了,其实w3c的css文档里有很详细明确的介绍(http://www.w3school.com.c ...
- $color$有色图
不想看题解的请速撤离 为防被骂灌输题解,撤离缓冲区 这里没字 $Ploya$神题一道,所以我自己做不出来,颓了一部分题解. 由于理(颓题)解不(没)深(脸)中途又拿了$std$对拍(输出中间结果并qj ...
- Android音频开发(1):基础知识
Android音频开发(1):基础知识 导读 人的说话频率基本上为300Hz~3400Hz,但是人耳朵听觉频率基本上为20Hz~20000Hz. 对于人类的语音信号而言,实际处理一般经过以下步骤: 人 ...
- 算法编程题积累(4)——腾讯笔试"有趣的数字“问题
本题基本思路:先对原序列进行排序,再根据不同情况采用不同算法. 首先差最大的对数最好求:用最小的数的个数 × 最大的数的个数即可. 接着求差最小的对数: 1.当序列中无重复关键字时:可知最小差必然产生 ...
- python——掌握sorted函数的用法
看本篇文章的前提是掌握 00函数的基本概念.01函数参数传递方式 可参考本人博客文章 sorted函数 是一个内建函数,接收一个可迭代对象,按照指定类型.指定顺序进行排序,特点是返回一个新的列表,不改 ...
- 品优购(IDEA版)-第二天
品优购-第2天 学习目标 目标1:运用AngularJS前端框架的常用指令 目标2:完成品牌管理的列表功能 目标3:完成品牌管理的分页列表功能 目标4:完成品牌管理的增加功能 目标5:完成品牌管理的修 ...
- Maven和Gradle中配置单元测试框架Spock
Maven Maven本身不支持其他JVM语言(例如Groovy或Scala).要在Maven项目中使用它,需要使用第三方插件.对于Groovy而言,最好的选择似乎是GMavenPlus(重写不再维护 ...
- RGW Data Layout
目录 Overview metadata bucket index data RGW Pools RGW Object References Overview RGW 中三个基本概念:user, bu ...