Xamarin与PCLStorage-放置SQLite3文件的位置?

时间:2018-07-16 00:47:03

标签: c# xamarin xamarin.ios xamarin.android

我正在阅读Manning Publications的“ Xamarin in Action”,并正在研究Countr示例。我正在使用下面的代码来检索Sqlite3文件,如本书第7章中所述。

var local = FileSystem.Current.LocalStorage.Path;
var datafile = PortablePath.Combine(local, "counters.db3");
connection = new SQLiteAsyncConnection(datafile);
connection.GetConnection();

我想再添加一个数据库,该数据库具有我已经准备好的静态内容。我需要将此数据库放置在应用程序的资产或资源中,并在应用程序加载时读取它。我意识到在Windows上,以上代码正在“ C:\ Users \\ AppData \ Local \ Microsoft.TestHost.x86 \ 15.6.2 \”中查找数据库。为了测试Model,我将ViewModel放在该位置,这对数据库有帮助。但是,我想知道放置数据库文件的正确位置以及如何访问它,以便可以在Android和iPhone模拟器中进行测试?

2 个答案:

答案 0 :(得分:1)

只需使用Environment.GetFolderPath并将数据库存储在Android和IOS允许您的应用存储数据的位置,而无需进一步的许可:

string dbPath = Path.Combine (
        Environment.GetFolderPath (Environment.SpecialFolder.Personal),
        "counters.db3");

您可以找到有关此文章的更多信息:

https://developer.xamarin.com/guides/android/data-and-cloud-services/data-access/part-3-using-sqlite-orm/

答案 1 :(得分:0)

在Visual Studio中,Xamarin解决方案默认情况下具有多个项目-

  • App.Core,其中包含设计模型和ViewModels所需的库
  • 具有Android SDK库的App.Droid可以为Android设备构建视图
  • 具有iOS SDK库的App.iOS,可为Apple设备构建View

由于该项目没有有关App文件系统的信息,因此无法在App.Core库中添加以下代码。只有App.Droid和App.iOS项目会携带此信息。

string dbPath = Path.Combine (
    Environment.GetFolderPath (Environment.SpecialFolder.Personal),
    "counters.db3");

由于我们要将具有预先存在的内容的数据库复制到LocalDirectory,因此必须更改App.Droid和App.iOS中的Setup.cs。例如,对于App.Droid,需要执行以下步骤(这是一种方法,当然还有替代方法)

  • 将Sqlite数据库放置在App.Droid / Assets文件夹中
  • 创建一个类文件(我们将其命名为AndroidConfiguration.cs)并添加一个称为copyElementDatabaseToLocalStorage()的方法(此方法的代码可在这些步骤列表之后找到)
  • 在SetUp.cs中,调用copyElementDatabaseToLocalStorage()方法

copyElementDatabaseToLocalStorage方法的代码:

using System;
using Android.App;
using System.IO;
using PCLStorage;

namespace App.Droid.AndroidSpecificSetters
{
    public class AndroidConfiguration    

        public async void copyElementDatabaseToLocalStorage()
        {
            string localStorage = FileSystem.Current.LocalStorage.Path;
            string databaseLocation = Path.Combine(localStorage, "counters.db3");

        try
        {
            if (!File.Exists(databaseLocation))
            {
                using (var binaryReader = new BinaryReader(Application.Context.Assets.Open("counters.db3")))
                {
                    using (var binaryWriter = new BinaryWriter(new FileStream(databaseLocation, FileMode.Create)))
                    {
                        byte[] buffer = new byte[2048];
                        int length = 0;
                        while ((length = binaryReader.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            binaryWriter.Write(buffer, 0, length);
                        }
                    }
                }
            }
        } catch (Exception e)
        {
           ...
        }

    }

   }
}

App.Droid Setup.cs构造函数内部的代码

    public Setup(Context applicationContext) : base(applicationContext)
    {
        AndroidConfiguration androidConfiguration = new AndroidConfiguration();
        androidConfiguration.copyElementDatabaseToLocalStorage();
    }