如何在 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;"。