【问题标题】:Use a local database in Xamarin在 Xamarin 中使用本地数据库
【发布时间】:2013-09-13 23:13:54
【问题描述】:

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

我有一个本地 SQL 数据库,我想调用它来显示数据。我不明白我怎么能做到这一点。有可能吗?

【问题讨论】:

标签: android sqlite xamarin xamarin.android local-database


【解决方案1】:

在认为这是一件微不足道的事情后,当我尝试设置一个快速测试项目时,我被证明是错误的。这篇文章将包含有关在 Xamarin 中为 Android 应用程序设置数据库的完整教程,作为未来 Xamarin 用户的参考。

一目了然:

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

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

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

首先去this repository下载Sqlite.cs;这提供了可用于对数据库运行查询的 Sqlite API。将该文件作为源文件添加到您的项目中。

2。将数据库添加为资产。

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

在整个示例中,我使用从 this site 重命名为 db.sqlite 的 Chinook_Sqlite.sqlite 数据库示例。

3。将 DB 设置为 AndroidAsset。

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

4。从您的 APK 中手动复制数据库。

由于数据库是作为资产包含的(打包在 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);
            }
        }
    }
}

这会将 DB 作为二进制文件从 APK 中提取出来,并将其放入系统外部存储路径中。实际上数据库可以去任何你想去的地方,我只是选择把它贴在这里。

我还读到 Android 有一个数据库文件夹,可以直接存储数据库;我无法让它工作,所以我只是用这种使用现有数据库的方法运行。

5。打开数据库连接。

现在通过 Sqlite.SqliteConnection 类打开到数据库的连接:

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

6。对 DB 进行操作。

最后,由于 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 数据库添加到适用于 Android 的 Xamarin 解决方案的方法!有关详细信息,请查看 Sqlite.net 库中包含的 examples、其 unit tests 和 Xamarin 文档中的 examples

【讨论】:

  • 谢谢马特,非常详细的回答。但是你能解释一下我如何将我的本地数据库复制到资产文件夹中吗?
  • 当然可以!在创建 Android 项目时,Xamarin 会自动生成 assets 文件夹。您应该在项目目录中找到它。例如:path\to\project\Assets。我刚到公司,所以我还不能更新答案,今晚会更新。
  • 如果答案对您有帮助/解决了您的问题,接受它总是好的。 :D
  • 我对一个相当大的数据库(~20mb)也有同样的问题。这个解决方案不会导致数据库被复制,一次在 apk 中,一次在文件系统上?这是对用户空间的巨大浪费...[编辑]我已经问了一个单独的问题here
  • @matthewrdev 我是移动开发新手。你能告诉我上面提到的代码在哪里写吗??
【解决方案2】:

这是我正在使用的,它正在工作

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

更多详细信息请查看this

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 2020-04-17
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    相关资源
    最近更新 更多