如何使用azure移动服务清除本地数据库?

时间:2018-05-28 18:57:30

标签: azure xamarin xamarin.forms azure-mobile-services

我正在使用Azure移动服务,我想清除本地数据库,我该怎么做?

我的本​​地数据库存在问题。当我在app中注销并与其他用户登录时,前一个用户的数据被加载给当前用户,我不知道为什么会这样。我在服务器端使用debug并且服务器返回正确的数据,然后我认为问题是本地数据库。

2 个答案:

答案 0 :(得分:1)

  

我正在使用Azure移动服务,我想清除本地数据库,我该怎么做?

要删除您的SQLite文件,您可以关注Deleting the backing store。此外,您可以利用IMobileServiceSyncTable提供的功能清除离线缓存下的记录,您可以关注Purging Records from the Offline Cache的详细信息。

  

当我在app中注销并与其他用户登录时,前一个用户的数据被加载给当前用户,我不知道为什么会这样。我在服务器端使用debug,服务器返回正确的数据

由于您没有提供有关您的实施的详细信息(例如,用户登录/注销,用户数据管理等),我建议您检查您的服务器/客户端是否都启用了每用户数据存储。您可以使用fiddler在其他用户登录时捕获网络跟踪,并确保返回正确的用户标识符(例如UserId),然后针对您的本地数据库检查查询。此外,我建议你关注adrian hall的关于Data Projection and Queries的书。

答案 1 :(得分:1)

您可以通过执行以下操作删除所有本地数据库文件。

var dbFiles = Directory.GetFiles(MobileServiceClient.DefaultDatabasePath, "*.db");
foreach (var db in dbFiles)
{
    File.Delete(db);
} 

但是,这会每次都删除所有数据并导致性能问题,因为每次执行此操作后,您都会从Azure数据库获取数据的新副本,而不是使用缓存副本设备的SQLite DB。

我们通常只将它用于调试,而foreach中的原因是捕获所有创建的数据库(参考我的上一个建议)

还有一些其他的事情可以尝试解决数据交叉的核心问题。

您可能会看到此行为的另一个原因。使用PullAsync,您是否向其传递了查询ID?您的PullAsync行应该与此类似。

GetAllFoo(string userId)
{
    return await fooTable.PullAsync("allFoo"+userId,fooTable.Where(f=>f.userId == userId));
}

请注意,查询ID每次都是唯一的(或至少对每个用户而言)。这主要由Azure的脱机同步部分使用,但结合Where语句(确保导入System.Linq),这应该确保只返回正确的数据。

您可以找到有关此here的更多信息。

此外,您可能需要考虑一些事项,为每个userId存储一个单独的数据库。我们为我们的应用程序(使用公司ID)执行此操作 - 以便每个数据库都是独立的。如果您这样做,并在登录时使用正确的数据库,则不存在任何数据交叉的可能性。