【发布时间】:2018-11-07 09:22:42
【问题描述】:
我正在使用 Azure 移动服务,我想清除本地数据库,我该怎么做?
我的本地数据库有问题。当我在应用程序中注销并与其他用户登录时,会为当前用户加载前一个用户的数据,我不知道为什么会发生这种情况。我在服务器端使用调试并且服务器返回正确的数据,那么我认为问题是本地数据库。
【问题讨论】:
标签: azure xamarin xamarin.forms azure-mobile-services
我正在使用 Azure 移动服务,我想清除本地数据库,我该怎么做?
我的本地数据库有问题。当我在应用程序中注销并与其他用户登录时,会为当前用户加载前一个用户的数据,我不知道为什么会发生这种情况。我在服务器端使用调试并且服务器返回正确的数据,那么我认为问题是本地数据库。
【问题讨论】:
标签: azure xamarin xamarin.forms azure-mobile-services
我正在使用 Azure 移动服务,我想清除本地数据库,我该怎么做?
要删除您的 SQLite 文件,您可以关注Deleting the backing store。此外,您可以利用IMobileServiceSyncTable 提供的功能来清除离线缓存下的记录,详情请关注Purging Records from the Offline Cache。
当我在应用程序中注销并与其他用户登录时,前一个用户的数据会为当前用户加载,我不知道为什么会发生这种情况。我在服务器端使用调试,服务器返回正确的数据
由于您没有提供有关您的实现的详细信息(例如用户登录/注销、用户数据管理等),我建议您检查您的服务器/客户端是否都启用了每用户数据存储。您可以使用 fiddler 在其他用户登录时捕获网络跟踪,并确保返回正确的用户标识符(例如 UserId),然后针对您的本地数据库检查查询。此外,我建议你关注阿德里安霍尔关于Data Projection and Queries的书。
您可以通过执行以下操作删除所有本地数据库文件。
var dbFiles = Directory.GetFiles(MobileServiceClient.DefaultDatabasePath, "*.db");
foreach (var db in dbFiles)
{
File.Delete(db);
}
但是,这每次都会删除所有数据并导致性能问题,因为每次执行此操作后,您都会从 Azure DB 中获取数据的新副本,而不是使用设备中的缓存副本SQLite 数据库。
我们通常只将它用于调试,它在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)执行此操作 - 以便每个数据库都是独立的。如果您这样做,并在登录时使用正确的数据库,则没有任何数据交叉的机会。
【讨论】: