我的Xamarin应用程序中有Azure App服务,直到今天早上,一切都正常运行了100%。

过了一会儿,我发现,只要执行.GetSyncTable()调用,SDK就会从本地存储中删除我的数据库。

我的服务如下所示:

private readonly IMobileServiceSyncTable<User> _table;
private readonly IMobileServiceClient _client;
private readonly MobileServiceSQLiteStore _store;
private readonly ICryptography _cryptography;
private readonly ISettings _settings;

public UserService(
    IMobileServiceClient client,
    ICryptography cryptography)
{
    _client = client;
    _cryptography = cryptography;
    _settings = new Settings(cryptography) as ISettings;

    _store = new MobileServiceSQLiteStore(Settings.SyncDb);
    _store.DefineTable<User>();

    _client.SyncContext.InitializeAsync(_store);

    _table = _client.GetSyncTable<User>();
}


然后执行“ All()”,如下所示:

public async Task<List<User>> All()
{
    try
    {
        var users = await _table.ToListAsync(); // <- this throws "table" not defined
        return users;
    }
    catch (SQLiteException sqlex)
    {
        Log.Warning("UserService", sqlex.Message);
    }
    catch (Exception ex)
    {
        Log.Warning("UserService", ex.Message);
    }
}


我一直在试图解决这个问题,而我离解决方案还很遥远。

在调试期间,如果我将调试器放到等待状态,并询问_store变量,则定义了“用户”表,然后几秒钟后,_store不再包含我的表。

我使用ADB下载本地存储,并在SQLite管理器中对其进行了查看,并且该表的确已定义,仅仅是因为某种原因,它“丢失”了?

任何想法将不胜感激。

最佳答案

据我了解,可能是由InitializeAsync引起的问题尚未正确初始化。您只是在_client.SyncContext.InitializeAsync(_store);类的构造函数中调用了UserService。并且您需要调用await _client.SyncContext.InitializeAsync(_store);来初始化存储。

常见的脱机同步初始化如下所示:

async Task InitializeAsync()
{
     // Short circuit - local database is already initialized
     if (Client.SyncContext.IsInitialized)
         return;

     // Create a reference to the local sqlite store
     var store = new MobileServiceSQLiteStore("offlinecache.db");

     // Define the database schema
     store.DefineTable<TodoItem>();

     // Actually create the store and update the schema
     await Client.SyncContext.InitializeAsync(store);
}




这是关于将操作包装到Azure云表的类似issue。此外,您可以阅读adrian hall关于An Offline Client的书。

10-07 20:18