【问题标题】:Xamarin + sqlite: Trouble reading databaseXamarin + sqlite:无法读取数据库
【发布时间】:2019-09-17 13:58:42
【问题描述】:

我正在打开一个数据库文件,并运行 select * 查询,但没有找到任何对象。我有:

  1. 在 SQLite 的 DB Browser 中创建了一个 DB,将 db 文件存储在公共项目中,以及具有适当构建操作 (AndroidAsset/BundleResource) 的 Droid/iOS 资产/资源
  2. 在通用代码中创建接口和在Droid中创建DatabaseService:

    public SQLiteConnection CreateConnection()
    {
        var sqliteFilename = "StepsDatabase.db";
        string documentsDirectoryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
        var path = Path.Combine(documentsDirectoryPath, sqliteFilename);
    
        var conn = new SQLite.SQLiteConnection(path);
    
        //conn.CreateTable<Step>();
        //conn.CreateTable<SuperStep>();
    
        return conn;
    }
    

    (我已经尝试过使用和不使用 .CreateTable,因为我看到这是另一个问题的可能解决方案)

  3. 为我的数据库中的两个表创建了 C# mdoels
namespace StepsDB
{
    [Table("Step")]
    public class Step
    {
        [PrimaryKey, AutoIncrement, Unique, Column("stepID")]
        public int stepID
        {
            get;
            set;
        }

        [NotNull, Column("name")]
        public string name
        {
            get;
            set;
        }

        [NotNull, Column("superStep")]
        public int superStep
        {
            get;
            set;
        }

        [Column("videoLocation")]
        public string videoLocation
        {
            get;
            set;
        }

        [Column("uploader")]
        public string uploader
        {
            get;
            set;
        }

        [Column("uploaderIG")]
        public string uploaderIG
        {
            get;
            set;
        }
    }
}
  1. 创建了一个调用 CreateConnection() 的 DatabaseManager,然后从表和空列表中创建了一个 select * 查询。

即使我调试并检查“conn”变量,它的 TableMappings Count = 0。

PS 使用安装在所有项目中的 sqlite-net-pcl NuGet。

我已经被这个问题困扰了很长时间,并且已经搜索了互联网,但没有一个对其他人有用的解决方案对我有用。请帮忙!

这也是我的第一个问题,如果我做错了什么,请告诉我。

【问题讨论】:

  • 您正在创建一个空数据库,因为您使用的路径与您存储预先创建的数据库的位置(资源/资产)不匹配。如果您打算写入数据库,则需要在应用启动时将其复制到用户可写文件夹。
  • 我只是想从中阅读。我检查了它创建的路径并查看了设备监视器,它就在那个位置。我还检查了 File.Exists(path),它返回 true。
  • 如果不存在,SQLite 将创建一个新的 dB。所以 file.exists 可能实际上没有用。您需要阅读如何使用 android assets
  • 你有资源或链接吗?我读过的所有内容和我看到的每个示例都具有该资产将在该路径中。谢谢。

标签: android database visual-studio sqlite xamarin


【解决方案1】:

我从来没有正确打开我的数据库资产,只创建了一个空文件。我现在用

var binaryReader = new BinaryReader(Android.App.Application.Context.Assets.Open(sqliteFilename))

打开资产并将其写入我最初尝试打开的文件位置。一旦我创建了连接,它就会正确映射到我的对象,并且我有一个要使用的列表! :) :)

【讨论】:

    【解决方案2】:

    您可以使用 EF Core 轻松访问 Sqlite 数据库。

    使用此命令安装 EFCore Sqlite 包:

    Install-Package Microsoft.EntityFrameworkCore.Sqlite
    

    然后您可以使用 EFCore 标准函数在运行时创建数据库。

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 2012-09-24
      相关资源
      最近更新 更多