如何在 Xamarin 应用程序中设置 SQLite.NET 页面大小? PRAGMA page_size 已忽略
How to set SQLite.NET page size in Xamarin app? PRAGMA page_size ignored
经过大量搜索后,我无法找到如何更改 SQLite.NET 页面大小的默认值 4096。我有一个 Xamarin Forms PCL 应用 SQLite.NET Async PCL Nuget(和 Twincoders 扩展,但这不相关)。
在平台项目中,SQLiteConnectionString 似乎没有设置页面大小的工具。
我的 iOS 代码如下所示:
private static SQLiteConnectionString connectionString = new SQLiteConnectionString(Path.Combine(DatabaseFilePath, DatabaseFilename), false);
private static SQLiteAsyncConnection asyncConnection = new SQLiteAsyncConnection(() => new SQLiteConnectionWithLock(new SQLitePlatformIOS(), connectionString));
public SQLiteAsyncConnection GetAsyncConnection()
{
return asyncConnection;
}
帮助感谢!如果没有办法,那也知道就好了。
******** 编辑:********
@Paul 建议使用 PRAGMA page_size,我确信这是正确的想法。但是 SQLite.Net 会忽略更改 page_size 的请求,即使尚未创建 table 且日志模式为默认。至少在 iOS。除非我的代码有误:
在 Xamarin 表单中 PCL 我有:
public interface ISQLite
{
SQLiteAsyncConnection GetAsyncConnection ();
}
在我的 iOS 项目中,我有:
private static string DatabaseFilename = "MyDatabase.db3";
private static string DatabaseFilePath
{
get
{
return (NSFileManager.DefaultManager.GetUrls
(NSSearchPathDirectory.LibraryDirectory,
NSSearchPathDomain.User) [0]).ToString();
}
}
private static readonly SQLiteConnectionString connectionString =
new SQLiteConnectionString(Path.Combine(DatabaseFilePath, DatabaseFilename), false);
private static readonly SQLiteAsyncConnection asyncConnection =
new SQLiteAsyncConnection(() => new SQLiteConnectionWithLock(new SQLitePlatformIOS(), connectionString));
public SQLiteAsyncConnection GetAsyncConnection()
{
var syncTask = new Task (() =>
{
//asyncConnection.ExecuteAsync("PRAGMA journal_mode=DELETE");
asyncConnection.ExecuteAsync ("PRAGMA page_size=1024"); // Has no effect on page size
});
syncTask.RunSynchronously();
return asyncConnection;
}
执行时没有错误,但不会更改页面大小。
欢迎所有想法!
******** 进一步编辑:********
添加 VACUUM 也没有效果:
asyncConnection.ExecuteAsync ("PRAGMA page_size=1024; vacuum");
按照此处所述使用 pragma 语句:
http://www.sqlite.org/pragma.html#pragma_page_size
编辑:这可能是一个 iOS 特定问题。深入挖掘我发现:
http://www.sqlite.org/wal.html
进入 WAL 模式后无法更改数据库页面大小,无论是在空数据库上还是通过使用 VACUUM 或通过使用备份 API 从备份恢复。您必须处于回滚日志模式才能更改页面大小。
在这里,看起来您可能处于 WAL 模式:
https://developer.apple.com/library/ios/qa/qa1809/_index.html
...在 iOS 7 和 OS X Mavericks 中,Core Data SQLite 存储的默认日志记录模式已更改为预写日志记录 (WAL)。
您可以在设置页面大小之前尝试 "PRAGMA journal_mode=DELETE;"。
经过大量搜索后,我无法找到如何更改 SQLite.NET 页面大小的默认值 4096。我有一个 Xamarin Forms PCL 应用 SQLite.NET Async PCL Nuget(和 Twincoders 扩展,但这不相关)。
在平台项目中,SQLiteConnectionString 似乎没有设置页面大小的工具。
我的 iOS 代码如下所示:
private static SQLiteConnectionString connectionString = new SQLiteConnectionString(Path.Combine(DatabaseFilePath, DatabaseFilename), false);
private static SQLiteAsyncConnection asyncConnection = new SQLiteAsyncConnection(() => new SQLiteConnectionWithLock(new SQLitePlatformIOS(), connectionString));
public SQLiteAsyncConnection GetAsyncConnection()
{
return asyncConnection;
}
帮助感谢!如果没有办法,那也知道就好了。
******** 编辑:********
@Paul 建议使用 PRAGMA page_size,我确信这是正确的想法。但是 SQLite.Net 会忽略更改 page_size 的请求,即使尚未创建 table 且日志模式为默认。至少在 iOS。除非我的代码有误:
在 Xamarin 表单中 PCL 我有:
public interface ISQLite
{
SQLiteAsyncConnection GetAsyncConnection ();
}
在我的 iOS 项目中,我有:
private static string DatabaseFilename = "MyDatabase.db3";
private static string DatabaseFilePath
{
get
{
return (NSFileManager.DefaultManager.GetUrls
(NSSearchPathDirectory.LibraryDirectory,
NSSearchPathDomain.User) [0]).ToString();
}
}
private static readonly SQLiteConnectionString connectionString =
new SQLiteConnectionString(Path.Combine(DatabaseFilePath, DatabaseFilename), false);
private static readonly SQLiteAsyncConnection asyncConnection =
new SQLiteAsyncConnection(() => new SQLiteConnectionWithLock(new SQLitePlatformIOS(), connectionString));
public SQLiteAsyncConnection GetAsyncConnection()
{
var syncTask = new Task (() =>
{
//asyncConnection.ExecuteAsync("PRAGMA journal_mode=DELETE");
asyncConnection.ExecuteAsync ("PRAGMA page_size=1024"); // Has no effect on page size
});
syncTask.RunSynchronously();
return asyncConnection;
}
执行时没有错误,但不会更改页面大小。
欢迎所有想法!
******** 进一步编辑:********
添加 VACUUM 也没有效果:
asyncConnection.ExecuteAsync ("PRAGMA page_size=1024; vacuum");
按照此处所述使用 pragma 语句:
http://www.sqlite.org/pragma.html#pragma_page_size
编辑:这可能是一个 iOS 特定问题。深入挖掘我发现: http://www.sqlite.org/wal.html 进入 WAL 模式后无法更改数据库页面大小,无论是在空数据库上还是通过使用 VACUUM 或通过使用备份 API 从备份恢复。您必须处于回滚日志模式才能更改页面大小。
在这里,看起来您可能处于 WAL 模式: https://developer.apple.com/library/ios/qa/qa1809/_index.html ...在 iOS 7 和 OS X Mavericks 中,Core Data SQLite 存储的默认日志记录模式已更改为预写日志记录 (WAL)。
您可以在设置页面大小之前尝试 "PRAGMA journal_mode=DELETE;"。