我正在阅读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模拟器中进行测试?
答案 0 :(得分:1)
只需使用Environment.GetFolderPath
并将数据库存储在Android和IOS允许您的应用存储数据的位置,而无需进一步的许可:
string dbPath = Path.Combine (
Environment.GetFolderPath (Environment.SpecialFolder.Personal),
"counters.db3");
您可以找到有关此文章的更多信息:
答案 1 :(得分:0)
在Visual Studio中,Xamarin解决方案默认情况下具有多个项目-
由于该项目没有有关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,需要执行以下步骤(这是一种方法,当然还有替代方法)
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();
}