我的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的书。