【问题标题】:How can I clear my local database using azure mobile services?如何使用 azure 移动服务清除本地数据库?
【发布时间】:2018-11-07 09:22:42
【问题描述】:

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

我的本​​地数据库有问题。当我在应用程序中注销并与其他用户登录时,会为当前用户加载前一个用户的数据,我不知道为什么会发生这种情况。我在服务器端使用调试并且服务器返回正确的数据,那么我认为问题是本地数据库。

【问题讨论】:

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


    【解决方案1】:

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

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

    当我在应用程序中注销并与其他用户登录时,前一个用户的数据会为当前用户加载,我不知道为什么会发生这种情况。我在服务器端使用调试,服务器返回正确的数据

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

    【解决方案2】:

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

    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)执行此操作 - 以便每个数据库都是独立的。如果您这样做,并在登录时使用正确的数据库,则没有任何数据交叉的机会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2018-08-20
      相关资源
      最近更新 更多