在Xamarin中使用本地数据库

46

我开始使用Visual Studio的Xamarin插件来创建Android应用。

我有一个本地的SQL数据库,我想调用它来显示数据。 我不知道如何实现这一点。 这可行吗?


相关链接:https://forums.xamarin.com/discussion/comment/102126/#Comment_102126 - BlueRaja - Danny Pflughoeft
2个回答

74

当我试图设置一个快速测试项目时,我认为这是一件微不足道的事情,但我被证明是错的。本文将包含一个完整的教程,介绍在Xamarin中为Android应用程序设置数据库,对于未来的Xamarin用户来说,这将是一个有用的参考。

一览:

  1. 将Sqlite.cs添加到您的项目中。
  2. 将数据库文件添加为Asset。
  3. 将数据库文件设置为构建为AndroidAsset。
  4. 手动将数据库文件复制到另一个目录。
  5. 使用Sqlite.SqliteConnection打开数据库连接。
  6. 使用Sqlite操作数据库。

为Xamarin Android项目设置本地数据库

1. 将Sqlite.cs添加到您的项目中。

首先,前往此存储库,下载Sqlite.cs;这提供了Sqlite API,可用于运行针对db的查询。将该文件作为源文件添加到您的项目中。

2. 将DB添加为Asset。

接下来,获取您的数据库,并将其复制到Android项目的Assets目录中,然后将其导入到项目中,以便它出现在解决方案的Assets文件夹下:

enter image description here

在本示例中,我使用了从此站点下载并将其命名为db.sqlite的Chinook_Sqlite.sqlite数据库样本。

3. 将DB设置为构建为AndroidAsset。

右键单击数据库文件,并将其设置为构建操作AndroidAsset。这将确保它被包含在APK的资产目录中。

enter image description here

4. 手动复制DB到APK外部。

由于DB作为Asset(打包在APK中),您需要提取它出来。

您可以使用以下代码完成此操作:

string dbName = "db.sqlite";
string dbPath = Path.Combine (Android.OS.Environment.ExternalStorageDirectory.ToString (), dbName);
// Check if your DB has already been extracted.
if (!File.Exists(dbPath))
{
    using (BinaryReader br = new BinaryReader(Android.App.Application.Context.Assets.Open(dbName)))
    {
        using (BinaryWriter bw = new BinaryWriter(new FileStream(dbPath, FileMode.Create)))
        {
            byte[] buffer = new byte[2048];
            int len = 0;
            while ((len = br.Read(buffer, 0, buffer.Length)) > 0)
            {
                bw.Write (buffer, 0, len);
            }
        }
    }
}

这将从APK中提取数据库作为二进制文件,并将其放置在系统外部存储路径中。实际上,数据库可以放在任何地方,我只是选择将其放在这里。

我还读到Android有一个数据库文件夹,可以直接存储数据库;但我无法让它起作用,所以我选择了使用现有的DB的这种方法。

5. 打开DB连接。

现在通过Sqlite.SqliteConnection类打开与DB的连接:

using (var conn = new SQLite.SQLiteConnection(dbPath))
{
        // Do stuff here...
}

6. 操作数据库。

最后,由于Sqlite.net是一个ORM,您可以使用自己的数据类型来操作数据库:

public class Album
{
    [PrimaryKey, AutoIncrement]
    public int AlbumId { get; set; }
    public string Title { get; set; }
    public int ArtistId { get; set; }
}

// Other code...

using (var conn = new SQLite.SQLiteConnection(dbPath))
{
    var cmd = new SQLite.SQLiteCommand (conn);
    cmd.CommandText = "select * from Album";
    var r = cmd.ExecuteQuery<Album> ();

    Console.Write (r);
}

摘要

这就是如何将现有的Sqlite数据库添加到您的Xamarin Android解决方案中的方法!要了解更多信息,请查看Sqlite.net库附带的示例,它的单元测试以及Xamarin文档中的示例


谢谢Matt,非常详细的回答。但是你能解释一下我如何将本地数据库复制到资产文件夹中吗? - user2631662
如果答案对您有帮助/解决了您的问题,接受它总是很好的。 :D - matthewrdev
我遇到了一个相同的问题,涉及到一个相当大的数据库(约20MB)。这个解决方案会不会导致数据库在apk和文件系统中重复存储?这将浪费用户的空间... [编辑] 我已经在这里提出了一个单独的问题链接 - BlueRaja - Danny Pflughoeft
是的,它会复制它。这个答案是针对重用现有数据库并需要与您的应用程序捆绑的情况而言的。 - matthewrdev
1
@matthewrdev,我是移动开发的新手。请问您能告诉我在哪里编写上述代码吗? - user6856823
显示剩余6条评论

1

以下是我正在使用的代码,它可以正常工作

  • 安装Sqlite插件
  • 创建访问不同平台服务的接口
  • 为表创建一个模型
  • 在您想要使用的所有平台上实现先前创建的接口
  • 使用插件在您的表上创建、获取、插入等

如需更详细的信息,请查看this


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接