我有一个Xamarin Forms解决方案。我添加了sqlite-net-pcl作为所有项目的参考。它在Android上工作正常但在Windows 8.1和Windows Phone 8.1上崩溃。我有一个IOS项目,但目前我还没有OSX尝试它。
我在Windows项目中使用它来访问数据库:
using System.IO;
using SQLite;
using Xamarin.Forms;
using HelloXamarin.Windows;
using Windows.Storage;
[assembly: Dependency(typeof(SQLiteDb))]
namespace HelloXamarin.Windows
{
public class SQLiteDb : ISQLiteDb
{
public SQLiteAsyncConnection GetConnection(string databaseName)
{
var documentsPath = ApplicationData.Current.LocalFolder.Path;
var path = Path.Combine(documentsPath, databaseName);
return new SQLiteAsyncConnection(path);
}
}
}
以下是我的推荐信:
尝试访问数据库时出现此异常:
'SQLite.SQLiteConnection'的类型初始值设定项引发了异常。
无法加载DLL'e_sqlite3':找不到指定的模块。 (HRESULT异常:0x8007007E)
我不知道如何解决这个问题,请帮助我!
整个解决方案可在GitHub上找到: https://github.com/apspot/HelloXamarin
答案 0 :(得分:1)
您需要添加SQLite扩展程序。
答案 1 :(得分:0)
尝试引用通用Windows平台应用程序的Visual C ++ 2015 Runtime。那为我解决了。
答案 2 :(得分:0)
这次,问题仍然是open。因此,在他们提供可靠解决方案之前,您可以使用this work around暂时解决问题。
添加一个帮助类
using System;
using System.Diagnostics;
using System.IO;
namespace SQLitePCL
{
public class NativeLibraryHack
{
public static bool Hacked { get; private set; }
public static bool DoHack()
{
if (Hacked) return true;
try
{
const string runtimeFolderName = "/runtimes";
var destinationPath = typeof(SQLitePCL.raw).Assembly.Location
.Replace("\\", "/");
var destinationLength = destinationPath.LastIndexOf("/", StringComparison.OrdinalIgnoreCase);
var destinationDirectory = destinationPath.Substring(0, destinationLength) + runtimeFolderName;
var sourcePath = new Uri(typeof(SQLitePCL.raw).Assembly.CodeBase)
.AbsolutePath;
var sourceLength = sourcePath.LastIndexOf("/", StringComparison.OrdinalIgnoreCase);
var sourceDirectory = sourcePath.Substring(0, sourceLength) + runtimeFolderName;
if (Directory.Exists(sourceDirectory))
CopyFilesRecursively(new DirectoryInfo(sourceDirectory), new DirectoryInfo(destinationDirectory));
}
catch (Exception ex)
{
//Ignore Exception
Debug.WriteLine(ex.Message);
return false;
}
return (Hacked = true);
}
private static void CopyFilesRecursively(
DirectoryInfo source,
DirectoryInfo target
)
{
foreach (var dir in source.GetDirectories())
CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
foreach (var file in source.GetFiles())
{
try
{
var destinationFile = Path.Combine(target.FullName, file.Name);
if (!File.Exists(destinationFile))
file.CopyTo(destinationFile);
}
catch (Exception ex)
{
//Ignore Exception
Debug.WriteLine(ex.Message);
}
}
}
}
}
然后在您的数据库迁移脚本之前添加hack,我正在使用Web API 2 所以我做了
RouteConfig.RegisterRoutes
NativeLibraryHack.DoHack();
using (KSDBContext db = new KSDBContext())
{
db.Database.Migrate();
}
答案 3 :(得分:0)
对我来说,它是通过将ISO 3166-1 alpha 2 codes添加到可执行项目中来实现的