Xamarin.Forms SQLite.NET 本地数据库

NuGet包:sqlite-net-pcl(作者 Frank A. Krueger,不要选错包) 项目名:LocalDatabaseTutorial

1. 新建项目

Visual Studio → 创建 Xamarin.Forms 空白应用

2. 安装 NuGet

NuGet管理器 → 浏览,搜索 sqlite-net-pcl,安装到共享项目 + Android + iOS平台项目。

3. 实体类 Person.cs

using SQLite;

namespace LocalDatabaseTutorial
{
    public class Person
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}
Code language: JavaScript (javascript)
  • [PrimaryKey]:主键
  • [AutoIncrement]:自增

4. 数据库访问类 Database.cs

using System.Collections.Generic;
using System.Threading.Tasks;
using SQLite;

namespace LocalDatabaseTutorial
{
    public class Database
    {
        readonly SQLiteAsyncConnection _database;

        public Database(string dbPath)
        {
            _database = new SQLiteAsyncConnection(dbPath);
            // 创建表,不存在则新建,存在不会重复报错
            _database.CreateTableAsync<Person>().Wait();
        }

        // 查询全部人员
        public Task<List<Person>> GetPeopleAsync()
        {
            return _database.Table<Person>().ToListAsync();
        }

        // 新增一条记录
        public Task<int> SavePersonAsync(Person person)
        {
            return _database.InsertAsync(person);
        }
    }
}
Code language: PHP (php)

SQLiteAsyncConnection = 异步版本,推荐用,避免UI卡顿

5. App.xaml.cs (全局数据库单例)

using System;
using System.IO;
using Xamarin.Forms;

namespace LocalDatabaseTutorial
{
    public partial class App : Application
    {
        static Database database;

        public static Database Database
        {
            get
            {
                if (database == null)
                {
                    // 数据库文件放在系统本地应用目录 people.db3
                    database = new Database(Path.Combine(
                        Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                        "people.db3"));
                }
                return database;
            }
        }

        public App()
        {
            InitializeComponent();
            MainPage = new MainPage();
        }

        protected override void OnStart() { }
        protected override void OnSleep() { }
        protected override void OnResume() { }
    }
}
Code language: PHP (php)

单例模式:整个App共用同一个数据库实例,数据库文件自动存在应用私有目录。

6. MainPage.xaml UI

<?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="LocalDatabaseTutorial.MainPage">
    <StackLayout Margin="20,35,20,20">
        <Entry x:Name="nameEntry"
               Placeholder="Enter name" />
        <Entry x:Name="ageEntry"
               Placeholder="Enter age" />
        <Button Text="Add to Database"
                Clicked="OnButtonClicked" />
        <ListView x:Name="listView">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextCell Text="{Binding Name}"
                              Detail="{Binding Age}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>
Code language: HTML, XML (xml)

7. MainPage.xaml.cs 后台逻辑

using System;
using Xamarin.Forms;

namespace LocalDatabaseTutorial
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        // 页面每次出现时加载数据库数据
        protected override async void OnAppearing()
        {
            base.OnAppearing();
            listView.ItemsSource = await App.Database.GetPeopleAsync();
        }

        async void OnButtonClicked(object sender, EventArgs e)
        {
            // 简单校验:姓名、年龄不为空
            if (!string.IsNullOrWhiteSpace(nameEntry.Text) && !string.IsNullOrWhiteSpace(ageEntry.Text))
            {
                await App.Database.SavePersonAsync(new Person
                {
                    Name = nameEntry.Text,
                    Age = int.Parse(ageEntry.Text)
                });

                // 清空输入框
                nameEntry.Text = ageEntry.Text = string.Empty;
                // 重新读取数据库刷新列表
                listView.ItemsSource = await App.Database.GetPeopleAsync();
            }
        }
    }
}
Code language: PHP (php)

运行逻辑

  1. 打开页面触发 OnAppearing → 读取数据库,绑定到ListView
  2. 输入姓名、年龄,点按钮 → 插入新Person记录
  3. 插入完成后,重新查询数据库刷新ListView

增加删除、更新方法

// 更新
public Task<int> UpdatePersonAsync(Person person)
{
    return _database.UpdateAsync(person);
}
// 删除
public Task<int> DeletePersonAsync(Person person)
{
    return _database.DeleteAsync(person);
}
Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注