繁体   English   中英

在Windows Phone 7应用程序的隔离存储中存储从Web服务接收的数据

[英]storing data received from web service in isolated storage in windows phone 7 application

我正在为Windows Phone 7构建一个应用程序,需要从Web服务中提取数据并将其显示在我的应用程序中。 现在,每当一次调用来自Web服务的数据页面时,都会一次又一次调用Web服务,因此结果需要花费一些时间才能显示数据。 因此,我想将数据存储在隔离的存储中,以便不会每次都调用Web服务。 请帮我做到这一点。 我在调用Web服务的代码是:

public const string aboutxml = "about.xml";

    public about()
    {
        InitializeComponent();
        LoadData();
    }

    private void LoadData()
    {
        bool isSuccess;
        //try to load data from iso store
        var doc = ReadXml(out isSuccess);
        if (isSuccess) PopulateList(doc);
        //if failed (data doesn't exists in iso store), download data from web service
        else
        {
            KejriwalService.aapSoapClient myclient = new KejriwalService.aapSoapClient();
            myclient.getarvindAboutCompleted += new EventHandler<KejriwalService.getarvindAboutCompletedEventArgs>(myclient_getarvindAboutCompleted);
            myclient.getarvindAboutAsync();
            progressName.Visibility = System.Windows.Visibility.Visible;

        }
    }

    //upon download completed, display data then save the xml to iso store
    void myclient_getarvindAboutCompleted(object sender, KejriwalService.getarvindAboutCompletedEventArgs e)
    {
        var doc = XDocument.Parse(e.Result);
        PopulateList(doc);
        WriteXml(doc);
    }


    private void PopulateList(XDocument doc)
    {
          var data = e.Result;

        XElement xml = XElement.Parse(data);

        aboutview.Text = xml.Elements("UserDetails").Elements("about_details").First().Value;
        progressName.Visibility = System.Windows.Visibility.Collapsed;

    }

    private XDocument ReadXml(out bool isSuccess)
    {
        isSuccess = false;
        var doc = new XDocument();
        using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            try
            {
                if (store.FileExists(aboutxml))
                {
                    using (var sr = new StreamReader(new IsolatedStorageFileStream(aboutxml, FileMode.OpenOrCreate, store)))
                    {
                        doc = XDocument.Load(sr);
                    }
                    isSuccess = true;
                }
            }
            catch (Exception ex) { }
        }
        return doc;
    }

    private bool WriteXml(XDocument document)
    {
        using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            try
            {
                using (var sw = new StreamWriter(new IsolatedStorageFileStream(aboutxml, FileMode.Create, store)))
                {
                    sw.Write(document.ToString());
                }
            }
            catch (Exception ex) { return false; }
        }
        return true;
    }

好的,我知道您想要一些代码,所以我们开始尝试以下代码:

public const string NewssXml = "Newss.xml";

public News()
{
    InitializeComponent();
    LoadData();
}

private void LoadData()
{
    bool isSuccess;
    //try to load data from iso store
    var doc = ReadXml(out isSuccess);
    if(isSuccess) PopulateList(doc);
    //if failed (data doesn't exists in iso store), download data from web service
    else 
    {
        KejriwalService.aapSoapClient client = new KejriwalService.aapSoapClient();
        client.getarvindNewsCompleted += new EventHandler<KejriwalService.getarvindNewsCompletedEventArgs>(client_getarvindNewsCompleted);
        client.getarvindNewsAsync();

        progressName.Visibility = System.Windows.Visibility.Visible;
    }
}

//upon download completed, display data then save the xml to iso store
void client_getarvindNewsCompleted(object sender, KejriwalService.getarvindNewsCompletedEventArgs e)
{
    var doc = XDocument.Parse(e.Result);
    PopulateList(doc);
    WriteXml(doc);
}

private void PopulateList(XDocument doc)
{
    List<Newss> listData = new List<Newss>();

    progressName.Visibility = System.Windows.Visibility.Collapsed;

    foreach (var location in doc.Descendants("UserDetails"))
    {
        Newss data = new Newss();
        data.News_Title = location.Element("News_Title").Value;
        data.News_Description = location.Element("News_Description").Value;
        data.Date_Start = location.Element("Date_Start").Value;
        data.image_path = location.Element("image_path").Value;
        data.ImageBind = new BitmapImage(new Uri( @"http://political-leader.vzons.com/ArvindKejriwal/images/uploaded/"+data.image_path, UriKind.Absolute));
        listData.Add(data);
    }
    listBox1.ItemsSource = listData;
}

private XDocument ReadXml(out bool isSuccess) 
{ 
    isSuccess = false;
    var doc = new XDocument(); 
    using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
        try 
        { 
            if (store.FileExists(NewssXml)) 
            { 
                using (var sr = new StreamReader(new IsolatedStorageFileStream(NewssXml, FileMode.OpenOrCreate, store))) 
                { 
                    doc = XDocument.Load(sr); 
                }
                isSuccess = true;               
            } 
        } catch (Exception ex) { } 
    } 
    return doc; 
}

private bool WriteXml(XDocument document) 
{ 
    using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
        try 
        { 
            using (var sw = new StreamWriter(new IsolatedStorageFileStream(NewssXml, FileMode.Create, store))) 
            { 
                sw.Write(document.ToString()); 
            } 
        } catch (Exception ex) { return false; } 
    } 
    return true; 
}

仅当您想知道它是如何构建的时:

  • 一般步骤与我上个月在此答案中解释的步骤相同。
  • 这篇博客文章改编的ReadXmlWriteXml方法
  • 其余的从您现有的代码中重构

将所有数据存储在XDocument中并进行检索是开销。 而是使用数据库存储和检索数据。 这将减少您的代码工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM