Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在Xamarin中使用本地数据库_Android_Sqlite_Xamarin_Xamarin.android_Local Database - Fatal编程技术网

Android 在Xamarin中使用本地数据库

Android 在Xamarin中使用本地数据库,android,sqlite,xamarin,xamarin.android,local-database,Android,Sqlite,Xamarin,Xamarin.android,Local Database,我已经开始使用VisualStudio的Xamarin插件来创建Android应用程序 我有一个本地SQL数据库,我想调用它来显示数据。我不知道我怎么能做到这一点。有可能吗?在认为这是一件小事之后,当我尝试设置一个快速测试项目时,我被证明是错误的。这篇文章将包含一个关于在Xamarin中为Android应用程序设置DB的完整教程,它将作为Xamarin未来用户的参考 一目了然: 将Sqlite.cs添加到项目中 将数据库文件添加为资产 将数据库文件设置为生成为AndroidAsset 手动将数据

我已经开始使用VisualStudio的Xamarin插件来创建Android应用程序


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

在认为这是一件小事之后,当我尝试设置一个快速测试项目时,我被证明是错误的。这篇文章将包含一个关于在Xamarin中为Android应用程序设置DB的完整教程,它将作为Xamarin未来用户的参考

一目了然:

  • 将Sqlite.cs添加到项目中
  • 将数据库文件添加为资产
  • 将数据库文件设置为生成为AndroidAsset
  • 手动将数据库文件从apk复制到另一个目录
  • 使用Sqlite.SqliteConnection打开数据库连接
  • 使用Sqlite对数据库进行操作
  • 为Xamarin Android项目设置本地数据库 1.将Sqlite.cs添加到项目中。 首先转到并下载Sqlite.cs;这提供了Sqlite API,可用于对数据库运行查询。将该文件作为源文件添加到项目中

    2.添加数据库作为资产。 接下来,获取数据库并将其复制到Android项目的资产目录中,然后将其导入到项目中,使其显示在解决方案的资产文件夹下:

    在本示例中,我使用的是重命名为db.Sqlite的Chinook_Sqlite.Sqlite数据库示例

    3.将DB设置为生成为AndroidAsset。 右键单击DB文件并将其设置为build action
    AndroidAsset
    。这将确保它包含在APK的资产目录中

    4.从APK中手动复制DB。 由于数据库是作为资产(打包在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中将DB提取为二进制文件,并将其放入系统外部存储路径中。实际上,DB可以去任何你想去的地方,我只是选择把它放在这里

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

    5.打开数据库连接。 现在通过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);
    }
    
    公共类相册
    {
    [主密钥,自动增量]
    public int AlbumId{get;set;}
    公共字符串标题{get;set;}
    公共int ArtistId{get;set;}
    }
    //其他代码。。。
    使用(var conn=new SQLite.SQLiteConnection(dbPath))
    {
    var cmd=new SQLite.SQLiteCommand(conn);
    cmd.CommandText=“从相册中选择*”;
    
    var r=cmd.ExecuteQuery包含在Sqlite.net库中,它和Xamarin文档中的。这里是我正在使用的一个,它正在工作

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

    有关更多详细信息,请检查

    谢谢Matt,非常详细的回答。但是您能解释一下我如何将本地数据库复制到assets文件夹中吗?当然可以!当您创建Android项目时,assets文件夹是由Xamarin自动生成的。您应该在您的项目目录中找到它。例如:
    path\to\project\assets
    。我刚刚到达ved正在工作,所以我现在还不能更新答案,今晚我会这样做。如果答案对你有帮助/解决了你的问题,接受它总是很好的。注意:我对一个相当大的数据库(约20mb)也有同样的问题。这个解决方案会不会导致数据库被复制,一次在apk中,一次在文件系统中?这是对用户空间的巨大浪费…[编辑]我问了一个单独的问题。@matthewrdev我是移动开发新手。你能告诉我在哪里编写上述代码吗?相关: