问题

我有Windows Phone 8应用。用户可以从应用程序上传照片,然后将条目添加到表中以使用Azure移动服务进行处理。表中的列之一是DeviceId。
这部分工作正常。

在另一个视图中,人们可以加载他们已经添加的条目列表。不幸的是,对于某些用户而言,这似乎不起作用,因为它不返回任何条目(我可以在数据库中找到他们的条目)。

请帮忙,因为我无法弄清楚为什么它适用于某些用户而不适用于其他用户。

这是我如何获取DeviceUniqueId的方法:

byte[] myDeviceID = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceUniqueId");
string DeviceIDAsString = Convert.ToBase64String(myDeviceID);


这是我添加新条目的方法:
TimelapseBatch.DeviceId(构造函数中的第一个参数是字符串)

var item = new TimelapseBatch(DeviceInfo.DeviceUniqueId, /*other properties go here*/);
await App.MobileService.GetTable<TimelapseBatch>().InsertAsync(item);


我如何查询服务

private readonly IMobileServiceTable<TimelapseBatch> batchesTable = App.MobileService.GetTable<TimelapseBatch>();
...
batches = await batchesTable.Where(t => t.DeviceId == DeviceInfo.DeviceUniqueId).ToListAsync();

var processed = batches.Where(t => t.StatusCode == (int)BatchStatus.Processed).OrderByDescending(t => t.Processed).Select(t => new Timelapse()
{
    Page = new Uri(t.PlayerUrl),
    Thumbnail = new Uri(t.ThumbnailUrl)
}).ToList();


显然,在所有这些处理之后,即使根据数据库,它也不包含任何条目。

我确实验证了当相同的用户(甚至遇到问题的用户)创建多个条目时,数据库中的DeviceId似乎是相同的。

请帮忙,为什么它对某些用户有效但对其他用户无效?

更新

因此,当我从遇到问题的客户那里使用DeviceUniqueId时,可以重现该问题。

另外,如果我这样做:

batches = await batchesTable.Take(200).ToListAsync();
batches = batches.Where(t => t.DeviceId == DeviceInfo.DeviceUniqueId).ToList();


它按预期填充批次。但是,如果我这样做(如下),则批处理为空(我指定200个用于测试目的,因为条目较少)。

batches = await batchesTable.Take(200).Where(t => t.DeviceId == DeviceInfo.DeviceUniqueId).ToListAsync();


更新2

如果DeviceId包含“ +”号,则比较似乎失败。如果我做

t.DeviceId.Substring(0,X) == DeviceInfo.DeviceUniqueId.Substring(0,X)


X是+号的位置,则它按预期工作。我的天啊。现在,我正拼命寻找一种解决方法。

更新3

类型定义:

public enum BatchStatus
{
    QueuedUp = 0,
    Processed = 1,
    Error = 2,
}

public class TimelapseBatch
{
    public TimelapseBatch()
    {
        TimelapseId = String.Empty;
        DeviceId = String.Empty;
        ContainerUrl = String.Empty;
        VideoMp4Url = String.Empty;
        VideoWebmUrl = String.Empty;
        ThumbnailUrl = String.Empty;
        Uploaded = new DateTime(2000, 1, 1);
        Processed = new DateTime(2000, 1, 1);
        PlayerUrl = String.Empty;
    }

    public TimelapseBatch(string deviceId, string timelapseId, string containerUrl, int photosCount, int fps):this()
    {
        DeviceId = deviceId;
        ContainerUrl = containerUrl;
        TimelapseId = timelapseId;
        PhotosCount = photosCount;
        Fps = fps;
        StatusCode = (int) BatchStatus.QueuedUp;
        Uploaded = DateTime.Now;
    }

    public int Id { get; set; }
    public int StatusCode { get; set; }

    public string TimelapseId { get; set; }
    public string DeviceId { get; set; }
    public string ContainerUrl { get; set; }
    public int PhotosCount { get; set; }
    public int Fps { get; set; }
    public DateTime Uploaded { get; set; }


    public string VideoMp4Url { get; set; }
    public string VideoWebmUrl { get; set; }
    public string ThumbnailUrl { get; set; }
    public double VideoSize { get; set; }
    public DateTime Processed { get; set; }

    public string PlayerUrl { get; set; }
}

最佳答案

现在的解决方案:

 batches = await batchesTable.Where(t => t.DeviceId == DeviceInfo.DeviceUniqueId.Replace("+", "%2B") || t.DeviceId == DeviceInfo.DeviceUniqueId).ToListAsync();


我不得不手动转义+号为%2B。添加了额外的条件,以防Azure团队修复该错误。

关于c# - DeviceUniqueId和Azure移动服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15629002/

10-11 08:48