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 ...
随机推荐
- Web购物车案例(servlet+bean+jsp)
一些B话 事情来得太突然,一个朋友说是要我帮忙做一个JavaWeb的课程设计,在过一天就要去答辩了- 这我哪受的了时间这么短还没有~~~,正准备委婉的拒绝的时候他说写完之后给我那个啥- 好吧,我就是这 ...
- UART中的硬件流控RTS与CTS
最近太忙了,没时间写对Ucos-II的移植,先将工作中容易搞错的一个知识点记录下来,关于CTS与RTS的. 在RS232中本来CTS 与RTS 有明确的意义,但自从贺氏(HAYES ) 推出了聪明猫( ...
- Elastic search集群新增节点(同一个集群,同一台物理机,基于ES 7.4)
一开始,在电脑上同一个集群新增节点(node)怎么试也不成功,官网guide又语焉不详?集群健康值yellow(表示主分片全部可用,部分复制分片不可用) 最后,在stackoverflow上找到了答案 ...
- CSPS模拟 59
经ooo提醒咕题解会掉rp 我反正也冒着改不完题的风险,就开始颓博了 话说好久没这么舒坦的垫过底了233 上来一看T1,立刻就转化题意为有奇偶性和距离限制的bfs 然后就没考虑子串不能越过母串边界的事 ...
- 磁盘冗余阵列之RAID10的配置
1988年由加利福尼亚大学伯克利分校发表的文章首次提到并定义了RAID,当今CPU性能每年可提升30%-50%但硬盘仅提升7%,渐渐的已经成为计算机整体性能的瓶颈,并且为了避免硬盘的突然损坏导致数据丢 ...
- Unicode字符串和非Unicode字符串
什么是Unicode? Unicode(统一码.万国码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每 ...
- 最适合Java开发者的一本书和一软件
一书-<Java编程思想> 一软件-IntelliJ IDEA Java自学是否可以成功,答案显而易见,可以. 自学Java关键看自己是否有毅力.是否有恒心. 自学Java 自学Java不 ...
- [WPF] Caliburn Micro学习二 Infrastructure
Caliburn Micro学习一 Installation http://blog.csdn.net/alvachien/article/details/12985415 Step 1. 无论是通过 ...
- PHP经典面试题:如何保证缓存与数据库的双写一致性?
只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说 ...
- spark基于yarn的两种提交模式
一.spark的三种提交模式 1.第一种,Spark内核架构,即standalone模式,基于Spark自己的Master-Worker集群. 2.第二种,基于YARN的yarn-cluster模式. ...