Windows Phone 調用天氣預報程式實現代碼

來源:互聯網
上載者:User
Windows Phone的本機資料庫SQL Server CE是7.1版本即芒果更新的新特性,所以你要在應用程式中使用SQL Server CE資料庫必須使用Windows Phone 7.1的API才行 。這個資料庫是用Linq來執行查詢等操作。
我們現在用資料庫來儲存城市的資料,包括所屬省份,城市名稱,城市代碼。在程式中我們只做了簡單的插入和查詢,需要詳細的資料庫操作可以參考
http://windowsphonegeek.com/tips/Windows-Phone-Mango-Local-Database(SQL-CE)-Introduction或者MSDN。
       現在回到工程上,先建立一個資料表,CityInfoTable.
在工程上右鍵---添加--類。命名為CityInfoTable.cs    ,接著添加引用。工程----右鍵---添加引用。
找到System.Data.Linq.點擊確定。

 接著在CityInfoTable.cs添加命名空間。

 代碼如下 複製代碼
using System.Data.Linq.Mapping;
using System.ComponentModel;

 

然後在CItyInfoTable這個資料表定義主鍵等屬性,給出完整的CityInfoTable.cs代碼

 

 代碼如下 複製代碼

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Data.Linq.Mapping;
using System.ComponentModel;


namespace WeatherForecast
{
    [Table]//把CItyInfoTable定義為表
    public class CityInfoTable
    {
        //定義表的自增ID。設定為主鍵
        private int _cityInfoid;

//Column這個是定義一個成員為表欄位。如果沒有這個,那麼這個成員不是欄位
        [Column(IsPrimaryKey = true, IsDbGenerated = true,
            DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
        public int CityInfoid
        {
            get
            {
                return _cityInfoid;
            }
            set
            {
                _cityInfoid = value;
            }
        }


        //定義省份名稱:
        private string _province;
        [Column]
        public string Province
        {
            get
            {
                return _province;
            }
            set
            {
                _province = value;
            }
        }

        //定義城市名稱
        private string _cityName;

        [Column]
        public string CityName
        {
            get
            {
                return _cityName;
            }
            set
            {
                _cityName = value;
            }
        }

        //定義城市代碼
        private string _cityCode;

        [Column]
        public string CityCode
        {
            get
            {
                return _cityCode;
            }
            set
            {
                _cityCode = value;
            }
        }

    }
}

現在再定義一個資料庫。工程---右鍵---建立類,命名為CityDataContext.cs。

 添加命名空間。

using System.Data.Linq;
然後讓這個類繼承於DataContext。

 給出CityDataContext.cs的完整代碼:

 

 代碼如下 複製代碼

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Data.Linq;


namespace WeatherForecast
{
    /// <summary>
    /// 定義一個資料庫
    /// </summary>
    public class CityDataContext : DataContext
    {
        //定義資料庫連接字串
        public static string connectionString = "Data Source=isostore:/CityInfo.sdf";

        //// 傳遞資料庫連接字串到DataContext基類
        public CityDataContext(string connectionString) : base(connectionString) { }


        //定義一個資料表,如果有多個資料表也可以繼續添加為成員變數
        public Table<CityInfoTable> CityInfos
        {
            get
            {
                return this.GetTable<CityInfoTable>();
            }
        }
    }
}
 

到這裡,資料庫算是寫好了。新手肯定會有疑問,沒有看到什麼資料庫。也沒在工程裡面看到什麼SDF檔案。

 因為,我們要在程式構建的時候用代碼建立資料庫,由上面的連接字串可以知道,資料庫建立後放在Isolatedstorage裡面,建立這個在App.xaml裡面的Launching事件裡面實現。

可以在這個事件裡添加這樣的代碼建立資料庫:

 

 代碼如下 複製代碼

using (CityDataContext db = new CityDataContext(CityDataContext.connectionString))
            {

                if (db.DatabaseExists() == false)
                {

                    //建立一個資料庫

                    db.CreateDatabase();
}
}

這個我們暫時不做。現在我們先添加一個城市資訊的XML檔案。下載:http://115.com/file/anme1scg#citycode.xml

 複製這個檔案。在工程上面右鍵--粘貼。就把這個citycode.xml檔案加入到了工程上。

 下來就做XML解析。用的XDocument類。這裡只是簡單應用了下。

我們要在App.xaml裡面的Launching 事件添加代碼。因為我們要在初次運行程式的時候要建立資料庫,並且解析citycode.xml的資料添加到資料庫裡面。

要讀取工程裡面的檔案。要用到的是Application.GetResourceStream.這個函數只能讀取資源檔。那麼我們要將citycode.xml檔案的Building屬性改為Resource。

操作方法:選擇citycode.xml-----點擊屬性---產生操作(Building)改為Resource。

要使用XDocument類,需要添加引用。添加System.Xml.Linq。已經添加很多次引用了,那麼這次就不詳細說怎麼操作了。

 在App.xaml.cs裡面添加命名空間;

 代碼如下 複製代碼

 
using System.Windows.Resources;
using System.IO;
using System.Xml.Linq;

新增成員函數:

 

 代碼如下 複製代碼

 private void CreatDB()
        {
            using (CityDataContext db = new CityDataContext(CityDataContext.connectionString))
            {

                if (db.DatabaseExists() == false)
                {

                    //建立一個資料庫

                    db.CreateDatabase();
                    //讀取資源檔。檔案為XML格式。這個檔案的Building屬性為Resource
                    StreamResourceInfo sri = Application.GetResourceStream(new Uri("/WeatherForecast;component/citycode.xml",
                        UriKind.Relative));
                    //讀取所以資料儲存到String類型的result中
                    string result;
                    using (StreamReader sr = new StreamReader(sri.Stream))
                    {
                        result = sr.ReadToEnd();
                    }

                    //用XDocument類解析資料
                    XDocument doc = XDocument.Parse(result);

                    //解析資料並且存入資料庫
                    foreach (XElement item in doc.Descendants("root").Nodes())
                    {
                        //由檔案中的資料可以知道。我們需要的資料在那麼兩個節點。Descendants就是尋找子節點。
                        string province = item.Attribute("data").Value;
                        foreach (XElement itemnode in item.Descendants("city"))
                        {
                            string cityname = itemnode.Element("cityname").Value;
                            string cityid = itemnode.Element("cityid").Value;
                            //把資料存入資料庫
                            CityInfoTable cityInfo = new CityInfoTable();
                            cityInfo.CityCode = cityid;
                            cityInfo.Province = province;
                            cityInfo.CityName = cityname;
                            db.CityInfos.InsertOnSubmit(cityInfo);
                        }
                    }
                    //資料庫提交更新
                    db.SubmitChanges();
                }

            }
        }
 

在Launching事件添加如下代碼:

CreatDB();
這樣,我們就能在第一次執行程式的時候,建立資料庫,並且解析XML資料,把城市資訊存入資料庫。

 那麼還是測試下吧。

在MainPage的Loaded事件中測試,查詢北京的資料,彈窗顯示。

在Loaded事件中添加如下代碼:

 代碼如下 複製代碼

 using (CityDataContext db = new CityDataContext(CityDataContext.connectionString))
            {
                IQueryable<CityInfoTable> queries =
                    from c in db.CityInfos where c.Province == "北京" && c.CityName == "北京" select c;
                MessageBox.Show(queries.First().CityName + queries.First().CityCode);
            }


成功!那麼就把剛才添加的測試代碼注釋掉吧。。。

PS:調試資料庫,XML解析的時候我可是相當糾結了。都是心理默念不要出錯,不要出錯。。。

 因為出錯的話,資料庫是建立了。但是資料八成沒有加入進去。要刪除資料庫,就要重啟模擬器了。因為重啟模擬器IsolatedStorage裡面的資料就沒了。但是,我的機子如果重啟模擬器的話,沒有個五六分鐘不行。。多出錯幾次半小時都沒了

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.