本节顺序与内容参考了,张引的《Xamarin全栈开发技术与实践》第六章内容。

本节讲两种本地存储方法,偏好存储(少量,临时)与本地数据库。

首先上代码
mainPage.xamlde:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="DataWR.MainPage"><StackLayout><Grid Margin="4"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Entry x:Name="PreferenceEntry"Grid.Row="0"Grid.Column="0"Grid.ColumnSpan="2"/><Button x:Name="PreferenceSaveButton"TextTransform="None"Grid.Row="1"Grid.Column="0"Text="Preference_Save"Clicked="PreferenceSaveButton_Clicked"/><Button x:Name="PreferenceReadButton"TextTransform="None"Grid.Row="1"Grid.Column="1"Text="Preference_Read"Clicked="PreferenceReadButton_Clicked"/><Label x:Name="PreferenceShowLabel"Grid.Row="2"Grid.Column="0"Grid.ColumnSpan="2"Text="Read"/></Grid><Grid Margin="4"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Label x:Name="DataBaseSavePath"Grid.Row="0"Grid.Column="0"></Label><ScrollViewGrid.Row="1"Grid.Column="0"><ListView x:Name="DatabaseListView"><ListView.ItemTemplate><DataTemplate><TextCell Text="{Binding ID}"Detail="{Binding IsFavorite}"/></DataTemplate></ListView.ItemTemplate></ListView></ScrollView><StackLayoutGrid.Row="2"Grid.Column="0"><Button x:Name="CreteDatabaseButton"Text="Create_DataBase"Clicked="CreteDatabaseButton_Clicked"/><Button x:Name="InsertDataButton"Text="Insert_Data"Clicked="InsertDataButton_Clicked"/><Button x:Name="ReadDataButton"Text="Read_Data"Clicked="ReadDataButton_Clicked"/></StackLayout></Grid></StackLayout></ContentPage>

MainPage.xaml.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using SQLite;
namespace DataWR
{//database 偏好,因为DataTemplate中对象为Favorite 所以也绑定了ID和IsFavoritepublic class Favorite{//[SQLite.PrimaryKey, SQLite.AutoIncrement] 将下一个值设为Key,且自动递增(在InsertAsync内生效)[SQLite.PrimaryKey, SQLite.AutoIncrement]public int ID { get; set; }public bool IsFavorite { get; set; }}public partial class MainPage : ContentPage{public MainPage(){InitializeComponent();//设计dataBase的类}private void PreferenceSaveButton_Clicked(object sender, EventArgs e){//保存Entry的Text属性到偏好存储中Xamarin.Essentials.Preferences.Set("Capabilities.Prefrernce.key", PreferenceEntry.Text);}private void PreferenceReadButton_Clicked(object sender, EventArgs e){//当key无对值时,返回默认值PreferenceShowLabel.Text = Xamarin.Essentials.Preferences.Get("Capabilities.Prefrernce.key", defaultValue:"No value");}private SQLite.SQLiteAsyncConnection connection = null;private async void CreteDatabaseButton_Clicked(object sender, EventArgs e){//3平台都存在的路径//Android:data/user/0/com.companyname.datawr/files/.local/share//IOS://UWP:C:\Users\Administrator\AppData\Local\Packages\9190ef76-0bd4-40c4-93d7-5a7c54b4a599_94myyrkwz0bv4\LocalStateDataBaseSavePath.Text = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);//用于拼接路径,处理/和\的问题var databasePath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),"database.db");//创建数据库connection = new SQLite.SQLiteAsyncConnection(databasePath);await connection.CreateTableAsync<Favorite>();//存在异步,需要添加await 且函数添加async声明}//插入随机数private Random random = new Random();private int id = 0;private async void InsertDataButton_Clicked(object sender, EventArgs e){//如不使用[SQLite.PrimaryKey, SQLite.AutoIncrement],可用id++的方式记录//var facorite = new Favorite { ID = id++, IsFavorite = random.NextDouble() > 0.5 };//只设置IsFavorite,ID恒等于0,但Insert之后的Id会自增?var facorite = new Favorite { ID = id++, IsFavorite = random.NextDouble() > 0.5 };await connection.InsertAsync(facorite);}private async void ReadDataButton_Clicked(object sender, EventArgs e){//读取赋值到ListViewDatabaseListView.ItemsSource=await connection.Table<Favorite>().ToListAsync();}}
}

直接运行是运行不起来的,缺个

对着项目,右键-》管理NuGet程序包-》然后安装sqlite-net-pcl。

注:如果“管理NuGet程序包”是无法选择,更改VS安装设定(工具-》获取工具和功能-》修改-》单个组件,然后直接搜索“NuGet”然后安装重启vs)

安装好qlite-net-pcl之后,程序就可以正常跑了。

为了找文件方便,我们用UWP调试。(记得将UWP项目设置为启动项)

如图,项目分为两部分,上半部分(红框)用的是偏好存储

通过一个Key值做标识将内容存储在Xamarin.Essentials.Preferences中。存在软件的临时目录里。关闭软件,再打开也还在,卸载软件时会清除内容。

下半部分(蓝筐)实现的是数据库方法,用到的是上安装的sqlite-net-pcl包中的数据库。

调试时,根据DataBaseSavePath.Text给出的路路径找到“database.db”的文件,手动删除。(因为没有写删除的代码)
主要是new出一个SQLite.SQLiteAsyncConnection对象,然后对其进行操作。

其中值得注意的是为了避免手机端和pc端 文件路径的斜杠与反斜杠的格式问题,编写路径时应使用System.IO.Path.Combine(a,b)进行补全。

如何直接查看.db文件呢?

下载一个DB Browser 官网:http://www.sqlitebrowser.org/

Xamarin 跨平台应用开发(5)——本地存储相关推荐

  1. Xamarin 跨平台应用开发(1)——环境配置

    1.什么是Xamarin ?         Xamarin是一个用C#语言开发跨平台应用的集成开发环境,已经被微软收购,免费开放使用,还整合进了VisualStudio. Xamarin简单理解就是 ...

  2. Xamarin跨平台移动开发解决方案

    Xamarin始创于2011年,旨在使移动开发变得难以置信地迅捷和简单.Xamarin的产品简化了针对多种平台的应用开发,包括iOS.Android.Windows Phone和Mac App.Xam ...

  3. Xamarin 跨平台应用开发(3)——数据与项目结构

    在讲具体函数之前,先聊一聊,Xamarin工程是具体怎样实现跨平台的. 比如Android平台,如截图: 在初始化的时候,初始化Xamarin平台的包,然后直接new了一个app对象. 而这个app对 ...

  4. 并入微软,跨平台移动开发利器Xamarin开源并可免费使用

    2016年3月18日,微软对Xamarin的收购正式落下帷幕. 作为Xamarin的成员,我们热爱C#,也希望每名开发者能在每台设备.各个应用上都能使用强大的.NET.助力于微软,Xamarin将实现 ...

  5. C#苹果应用开发——第一讲初始Xamarin Xamarin ios 教程 Xamarin跨平台开发

    C#苹果应用开发--第一讲初始Xamarin   Xamarin ios 教程 Xamarin跨平台开发 C#苹果应用开发 教程观看地址:v.youku.com/v_show/id_XNzA3OTUx ...

  6. Xamarin ios 教程 Xamarin跨平台开发 C#苹果应用开发

    C#苹果应用开发 视频观看地址:56.com/u46/v_MTEyOTg1NTIz.html(复制) 描述: Xamarin ios 教程 Xamarin跨平台开发 C#苹果应用开发 随着iOS的日益 ...

  7. 【Android应用开发】 Android 崩溃日志 本地存储 与 远程保存

    示例代码下载 : http://download.csdn.net/detail/han1202012/8638801; 一. 崩溃日志本地存储 1. 保存原理解析 崩溃信息本地保存步骤 : -- 1 ...

  8. 安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式

    ​ 安卓开发之数据存储在本地的四种方式 本地数据存储,在安卓开发过程中是不可避免的一个话题.这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据. 基本上我们有 ...

  9. Taro开发微信小程序保持登录状态(本地存储)

    Taro 一.Taro官网链接 Taro是 由凹凸实验室倾力打造的 一个开放式跨端跨框架解决方案,支持使用React.Vue.js.Nerv等框架来开发小程序.H5.react Native等应用. ...

最新文章

  1. 25条实用的Python一行代码,你用过哪些?
  2. CMD 一条命令 执行 多条命令
  3. 分组背包基础--1712 ACboy needs your help
  4. PAT1060. 爱丁顿数
  5. ae去闪插件deflicker使用_夜晚视频灯光去闪烁 Deflicker插件
  6. 计算机电源+3c认证,电源适配器要不要做3C认证?怎么做
  7. 搭档之家|立秋·暑去凉来 叶落知秋
  8. filtering_audio.c/filtering_video.c 解读
  9. 简单阶乘计算 (本题要求实现一个计算非负整数阶乘的简单函数)
  10. C++ “switch“ 语句的简单讲解
  11. android预览ppt插件,Android UI基本控件.ppt
  12. 0211书架的制作过程(使用3DsMAX2016)
  13. QCC30xx CSR867x sink工程配置后级耳放在通话中的问题
  14. 【转】BAT机器学习面试1000题系列(1~50)
  15. 第19届中国制博会如期而至,百超迪能重装亮相引关注
  16. 信息系统项目管理师第一章复习内容(持续更新中……)
  17. dpi和ppi换算_DPI、PPI、DP、PX 的详细计算方法及算法来源是什么?
  18. 表格号码归属地查询的正确检测方式
  19. 【图像处理matlab】PCA+KNN人脸识别 ORL人脸数据集
  20. java公告_[公告]java起步篇

热门文章

  1. 第一章、ImageMagick7.0使用教程
  2. Visio 文本输入不了空格
  3. 面试TCP/IP被虐了?
  4. 正点原子STM32f103ZE精英开发板实现基于ESP8266 WIFI模块温湿度数据上传至乐联网平台
  5. 北美贾跃亭判了!靠一台道具车狂奔上市,340亿美元巅峰市值一度超越福特
  6. MaNGOS 下载,编译,配置和运行的基本步骤
  7. html5游戏开发box2djs,基于HTML5的WebGL结合Box2DJS物理应用
  8. 腾讯云轻量应用服务器性能测评(全网超详细)
  9. canvas 放射线渐变/圆形渐变详解
  10. 使用Python处理Excel表格