- 浏览: 13219010 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
sanrenxing_1:
GoEasy 实时推送支持IE6-IE11及大多数主流浏览器的 ...
WindowsPhone消息推送服务 -
张砚辉:
两侧照片绕Y轴旋转后有锯齿,请问锯齿解决方案,很长时间没解决
自定义带倒影和偏转的超炫Gallery -
knight_black_bob:
能不能把你自己的博客整理下分类下,写了这么多 ,都不知道怎么查 ...
Android_View,ViewGroup,Window之间的关系 -
jeasonyoung:
你这个代码实现在iOS8下应该是滑不动的
UISlider 滑块控件—IOS开发 -
wx_hello:
如果能写个可运行的java程序,不胜感激。。。
rs232串口通信原理
请您先登录,才能继续操作
Windows Phone开发(48):不可或缺的本地数据库
也许WP7的时候,是想着让云服务露两手,故似乎并不支持本地数据库,所有数据都上传上“云”数据库中。不过呢,在SDK 7.1后,又加进了本地数据库功能。
这个本地数据库的操作,与我们平常在WindowsForm或WPF项目中所使用数据库的情况有些不一样:一者没有图形化的设计器;二来不使用SQL语句。
那么,你一定会问:“那用什么来处理与数据库的交互?”
不知道各位.NET基础学得怎么样,如果你的基础比较扎实,一提到不使用SQL语句也能操作数据库,你大脑里肯定闪出一道亮光,你一定想到了。
对啊,就是那个很有趣很好玩的LINQ,是啊,LINQ是什么,估计不用我介绍了,新发明,当然也不新了,呵呵。
那么,我们应该还记得Linq to SQL这个东西,各位在其他项目中一定玩得很熟,怎么玩的呢?我来帮大家回忆一下吧。在VS里面打开一个数据库,新建一个LINQ to SQL类,然后把数据库中的表拖到设计窗口,实际上,就生成了一个个实体类了。如何?有印象吧,如果没有,对不起,回去复习。
DataContext类会被翻译为“数据上下文”,读起来是不是有些莫名其妙,不管它,你就把它当成是数据库的一个代理,就好像看到它就看到数据库一样;就好比某人的照片一样,看到照片你就想起她。
也可以理解为,一个DataContext就表示一个数据库,然后在DataContext的派生类中声明N个公共字段,类型为Table<T>,T就是你定义的实体类,一个实体类的定义就等于一个表的定义,一个DataContext的子类中定义N个Table<T>,就如同一个数据库中包含N个表一样。
我相信,只要对把LINQ和LINQ to SQL学得好,在WP中的本地数据库操作是绝对不需要学习新知识的。这也是.NET的一个不错的优点,高度集成统一。
不过呢,连接字符串就必须了解一下了,毕竟它和其他项目中的连接字符串是不同的。
重点一:数据库的路径。数据库也是一个文件,因此,它肯定也有保存路径,我们知道WP是使用独立存储的,所以,一般情况下,我们会在独立存储中创建数据库。当然,路径有两种:
(1)以appdata开头的,如appdata:/abc.sdf,意思就是应用程序安装包里面的文件(如XAP文件),这种情况不推荐,因为我们只能通过代码来创建数据库的,而添加到VS项目中的数据库文件一般是从独立存储区中提取的,但我们不太必要这样做。
(2)以isostore开头的,如isostore:/abc.sdf,这指示数据库位于独立存储空间中。
如果各位觉得这些东西太复杂,我给大家两个连接字符串,基本上可以通过,如果没有特殊需要,侈直接照抄,然后把相关的参数改一个就是了。
第一条:不带密码的:
isostore:/database.sdf
这个够简单吧,如果不带密码,就这句就够,绝对万能的,其中,database.sdf是文件名,这个嘛,你自己喜欢。
第二条:带密码的,最好要有密码
Data Source='isostore:/database.sdf';Password='123456789'
不多说,就是多了一个密码而已。
用这两条,基本可以走遍天下了。
没有例子是不行的,接下来,我们用实例去说明,这个实例内容不少。
在你新建WP项目后,在“解决方案资源管理器”中右击“引用”,添加引用,并找到“System.Data.Linq”。
第一部分,先写好与数据库有关的逻辑。
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 Microsoft.Phone.Data.Linq; using System.Data.Linq; using System.Data.Linq.Mapping; using System.ComponentModel; namespace MyApp { public class MyDataContext : DataContext { /// <summary> /// 连接字符串 /// </summary> public const string ConnectionString = "Data Source='isostore:/MyDb.sdf';Password='123456'"; /// <summary> /// 构造函数 /// </summary> public MyDataContext() : base(ConnectionString) { } public Table<Students> Students; } [Table] public class Students : INotifyPropertyChanged, INotifyPropertyChanging { string _stuNo; /// <summary> /// 学号 /// </summary> [Column(CanBeNull = false, IsPrimaryKey = true)] public string StuNo { get { return this._stuNo; } set { if (_stuNo != value) { OnPropertyChanging(new PropertyChangingEventArgs("StuNo")); this._stuNo = value; OnPropertyChanged(new PropertyChangedEventArgs("StuNo")); } } } string _name; /// <summary> /// 姓名 /// </summary> [Column] public string Name { get { return this._name; } set { if (_name != value) { OnPropertyChanging(new PropertyChangingEventArgs("Name")); _name = value; OnPropertyChanged(new PropertyChangedEventArgs("Name")); } } } string _email; /// <summary> /// 电邮 /// </summary> [Column] public string Email { get { return this._email; } set { if (_email != value) { OnPropertyChanging(new PropertyChangingEventArgs("Email")); _email = value; OnPropertyChanged(new PropertyChangedEventArgs("Email")); } } } public event PropertyChangingEventHandler PropertyChanging; public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanging(PropertyChangingEventArgs e) { if (PropertyChanging != null) { PropertyChanging(this, e); } } protected void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) { PropertyChanged(this, e); } } } }
注意,实体类必须要实现INotifyPropertyChanged接口,最好连同INotifyPropertyChanging接口,这样可以改善性能。记住了,一定要实现这两个接口,而且要触发PropertyChanging和PropertyChanged事件,不然你提交到数据库是不能更新数据的。
这个我想不难懂,因为在WPF里面也是这样的,除非你把实体类的属性都定义为依赖项属性,但最好不要这样,依赖项属性虽然节约内存,但是因为它需要进行全局注册,有可能会拖延应用程序的启动时间。
第二部分,创建数据库。
独立存储本来是没有数据库的,所以,在第一次使用应用程序时,必须先创建数据库,你说,在什么时候创建呢?想来想去,还是在应用程序类的构造函数中判断数据库是否存在,如果不存在,就创建。
#region 创建数据库 using (MyDataContext dc = new MyDataContext()) { if (dc.DatabaseExists() == false) { dc.CreateDatabase(); } } #endregion
以上代码是写在App类的构造函数中。
第三部分,应用程序页面。
我们做一个简单的“学员信息登记系统”,道先应用程序运行时打开主页,主页上显示已经添加到数据库中的学员信息,在列表上每条记录都有两个操作按钮:“编辑”按钮点击后会跳到修改页,允许用户修改学员信息;“删除”按钮不用我说了,一去不复返。
主页一下方的应用程序栏中有两个按钮,“刷新”和“新增”,刷新不用解释,新增就是跳到新增页面,输入新学员信息,然后保存。
先看看几个效果图吧。
首先,我们要用到一个图标,不用自己做,SDK自带了一堆,在这里可以找到C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Icons\dark,看到喜欢的添加到项目中即可,生成操作设为“内容”,“如果较新则复制”。
主页:MainPage.xaml
<phone:PhoneApplicationPage x:Class="MyApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="696" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True"> <!--LayoutRoot 是包含所有页面内容的根网格--> <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel 包含应用程序的名称和页标题--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="学员列表" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - 在此处放置其他内容--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <ListBox Name="stuList" HorizontalContentAlignment="Center"> <ListBox.ItemTemplate> <DataTemplate> <Grid Margin="2,10,2,2"> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition Height="auto"/> <RowDefinition Height="auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" Grid.Row="0" Text="学号:"/> <TextBlock Grid.Column="0" Grid.Row="1" Text="姓名:"/> <TextBlock Grid.Column="0" Grid.Row="2" Text="电邮:"/> <TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding StuNo}"/> <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding Name}"/> <TextBlock Grid.Column="1" Grid.Row="2" Text="{Binding Email}"/> <StackPanel Orientation="Horizontal" Grid.Column="2" Grid.Row="1" Grid.RowSpan="2"> <Button BorderThickness="0" Tag="{Binding StuNo}" Click="OnDataEdit" Margin="-5"> <Button.Content> <Image Stretch="Uniform" Source="appbar.edit.rest.png"/> </Button.Content> </Button> <Button Tag="{Binding StuNo}" Click="OnDataDelete" BorderThickness="0" Margin="-5"> <Button.Content> <Image Stretch="Uniform" Source="appbar.delete.rest.png"/> </Button.Content> </Button> </StackPanel> </Grid> </DataTemplate> </ListBox.ItemTemplate> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch"/> </Style> </ListBox.ItemContainerStyle> </ListBox> </Grid> </Grid> <phone:PhoneApplicationPage.ApplicationBar> <shell:ApplicationBar> <shell:ApplicationBarIconButton Text="刷新" IconUri="appbar.refresh.rest.png" Click="onRefresh"/> <shell:ApplicationBarIconButton Text="新增" IconUri="appbar.add.rest.png" Click="onNew"/> </shell:ApplicationBar> </phone:PhoneApplicationPage.ApplicationBar> </phone:PhoneApplicationPage>
ListBox由于显示的项结构复杂,所以就搞了个自定义数据模板。
MainPage.xaml.cs中的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using Microsoft.Phone.Controls; namespace MyApp { public partial class MainPage : PhoneApplicationPage { // 构造函数 public MainPage() { InitializeComponent(); } // 编辑 private void OnDataEdit(object sender, RoutedEventArgs e) { Button btn = e.OriginalSource as Button; if (btn != null) { string no = btn.Tag as string; NavigationService.Navigate(new Uri("/EditPage.xaml?sno=" + no, UriKind.Relative)); } } // 删除数据 private void OnDataDelete(object sender, RoutedEventArgs e) { Button btn = e.OriginalSource as Button; if (btn != null) { string sNo = btn.Tag.ToString(); using (MyDataContext dc = new MyDataContext()) { Students stu = dc.Students.FirstOrDefault(s => s.StuNo == sNo); if (stu != null) { dc.Students.DeleteOnSubmit(stu); dc.SubmitChanges(); BindList(); } } } } private void onRefresh(object sender, EventArgs e) { BindList(); } // 新增 private void onNew(object sender, EventArgs e) { NavigationService.Navigate(new Uri("/AddPage.xaml", UriKind.Relative)); } /// <summary> /// 把数据绑定到ListBox /// </summary> private void BindList() { using (MyDataContext dc = new MyDataContext()) { var res = from s in dc.Students select s; this.stuList.ItemsSource = res.ToList(); } } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); BindList(); } } }
新增页:AddPage.xaml
<phone:PhoneApplicationPage x:Class="MyApp.AddPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" mc:Ignorable="d" d:DesignHeight="696" d:DesignWidth="480" shell:SystemTray.IsVisible="True"> <!--LayoutRoot 是包含所有页面内容的根网格--> <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel 包含应用程序的名称和页标题--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="新增记录" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - 在此处放置其他内容--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <TextBlock Text="学号:"/> <TextBox Name="txtNo"/> <TextBlock Text="姓名:" Margin="0,7,0,0"/> <TextBox Name="txtName"/> <TextBlock Margin="0,7,0,0" Text="Email:"/> <TextBox Name="txtEmail"/> </StackPanel> </Grid> </Grid> <phone:PhoneApplicationPage.ApplicationBar> <shell:ApplicationBar IsVisible="True"> <shell:ApplicationBarIconButton IconUri="appbar.save.rest.png" Text="保存" Click="onSave"/> <shell:ApplicationBarIconButton IconUri="appbar.cancel.rest.png" Text="取消" Click="onCancel"/> </shell:ApplicationBar> </phone:PhoneApplicationPage.ApplicationBar> </phone:PhoneApplicationPage>
AddPage.xaml.cs中的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using Microsoft.Phone.Controls; namespace MyApp { public partial class AddPage : PhoneApplicationPage { public AddPage() { InitializeComponent(); } private void onCancel(object sender, EventArgs e) { //NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); if (NavigationService.CanGoBack) { NavigationService.GoBack(); } } private void onSave(object sender, EventArgs e) { if (txtNo.Text == "") { MessageBox.Show("学号不能为空。"); return; } if (txtName.Text == "") { MessageBox.Show("姓名不能为空。"); return; } using (MyDataContext dc = new MyDataContext()) { if (dc.Students.Where(c=>c.StuNo == txtNo.Text).Count() > 0) { MessageBox.Show("输入的学号已经存在。"); return; } Students stu = new Students() { StuNo = txtNo.Text, Name = txtName.Text, Email = txtEmail.Text }; dc.Students.InsertOnSubmit(stu); dc.SubmitChanges(); } //NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); if (NavigationService.CanGoBack) { NavigationService.GoBack(); } } } }
编辑页:EditPage.xaml
<phone:PhoneApplicationPage x:Class="MyApp.EditPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" mc:Ignorable="d" d:DesignHeight="696" d:DesignWidth="480" shell:SystemTray.IsVisible="True"> <!--LayoutRoot 是包含所有页面内容的根网格--> <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel 包含应用程序的名称和页标题--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="编辑记录" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - 在此处放置其他内容--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <TextBlock Text="学号:"/> <TextBlock Name="txtNo"/> <TextBlock Text="姓名:" Margin="0,7,0,0"/> <TextBox Name="txtName"/> <TextBlock Margin="0,7,0,0" Text="Email:"/> <TextBox Name="txtEmail"/> </StackPanel> </Grid> </Grid> <phone:PhoneApplicationPage.ApplicationBar> <shell:ApplicationBar IsVisible="True"> <shell:ApplicationBarIconButton IconUri="appbar.save.rest.png" Text="保存" Click="onSave"/> <shell:ApplicationBarIconButton IconUri="appbar.cancel.rest.png" Text="取消" Click="onCancel"/> </shell:ApplicationBar> </phone:PhoneApplicationPage.ApplicationBar> </phone:PhoneApplicationPage>
EditPage.xaml.cs中的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using Microsoft.Phone.Controls; namespace MyApp { public partial class EditPage : PhoneApplicationPage { public EditPage() { InitializeComponent(); } private void onSave(object sender, EventArgs e) { if (txtName.Text == "" ) { MessageBox.Show("姓名不能为空。"); return; } using (MyDataContext dc = new MyDataContext()) { Students stu = dc.Students.FirstOrDefault(s => s.StuNo == txtNo.Text); if (stu != null) { stu.Name = txtName.Text; stu.Email = txtEmail.Text; dc.SubmitChanges(); } } //NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); if (NavigationService.CanGoBack) { NavigationService.GoBack(); } } private void onCancel(object sender, EventArgs e) { //NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); if (NavigationService.CanGoBack) { NavigationService.GoBack(); } } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); if (NavigationContext.QueryString.ContainsKey("sno")) { txtNo.Text = NavigationContext.QueryString["sno"]; using (MyDataContext dc = new MyDataContext()) { Students stu = dc.Students.FirstOrDefault(s => s.StuNo == txtNo.Text); if (stu != null) { txtName.Text = stu.Name; txtEmail.Text = stu.Email; } } } } } }
代码贴完了,因为实在不太好解释,而且也不算很复杂,相信各位能看得懂。
但这次的例子,代码实在有点多,所以,我会上传到“资源”中,大家去下载之后再看吧,在VS里面看代码舒服一些。
相关推荐
在Windows Phone平台上进行应用开发时,本地数据存储是不可或缺的一部分,尤其是在需要持久化用户数据或者应用程序状态的情况下。本示例源码着重展示了如何在Windows Phone应用程序中操作本地数据库,为开发者提供了...
在Windows Phone 7 (WP7)平台上开发应用时,数据存储是不可或缺的一部分。为了实现本地数据持久化,开发者通常会使用轻量级的SQL Server Compact Edition (SQL CE)。SQL CE是一个嵌入式数据库系统,适合移动设备上的...
在移动应用中,网络通信是不可或缺的部分。这章可能讨论了如何使用HTTP协议进行网络请求,集成RESTful API,以及处理XML或JSON数据。 5. **第23章:多媒体与图形** Windows Phone 8支持多媒体功能,如摄像头、...
总的来说,这本书是Windows Phone 8开发者不可或缺的资源,它全面覆盖了从基础到高级的开发技能,无论你是初学者还是经验丰富的开发者,都能从中受益。通过学习和实践,你可以掌握创建引人入胜且功能强大的Windows ...
这本书是Windows Phone 7开发者不可或缺的参考资料,无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。通过阅读《Microsoft.Press.Windows.Phone.7.Development.Internals.pdf》,你将能掌握构建高质量...
在Windows Phone 7 (WP7)平台上开发应用时,数据存储是不可或缺的一部分。为了实现本地数据持久化,开发者经常选择建立数据库。本篇文章将详细探讨如何在WP7中创建和使用数据库来存储数据。 首先,我们需要了解WP7...
在当今数字化时代,智能手机已经成为人们日常生活中不可或缺的一部分,它们不仅具备通讯功能,还提供了丰富的应用服务。智能手机操作系统的选择对于用户体验和开发者生态至关重要。本篇将主要探讨三大主流智能手机...
在Windows Phone 8 (WP8)平台上开发应用时,数据存储是不可或缺的一部分。"Local DB in WP8"指的是在WP8设备上使用本地数据库来管理应用程序的数据。这种技术允许开发者在离线环境下存储和检索数据,提高应用的性能...
总结起来,这个章节覆盖了Windows Phone应用开发中的核心领域,包括数据持久化、云服务集成、本地数据库操作、网络通信以及推送通知,这些都是构建功能丰富的移动应用不可或缺的技术点。通过这些Demo,开发者能够...
网络功能是现代移动应用不可或缺的一部分,它允许应用连接到互联网,获取远程数据,或与其他设备进行通信。Windows Phone提供了丰富的API来支持网络通信,包括但不限于HTTP请求、Socket编程和Web服务调用等。理解...
在IT行业中,移动应用开发是不可或缺的一部分,而“基于wex5平台开发的外卖App”则是这个领域的一个具体实例。Wex5是一个强大的跨平台移动应用开发框架,它允许开发者用HTML5、CSS3和JavaScript编写一次代码,然后在...
【手机地图开发】\n\n手机地图开发是一个重要的IT领域,尤其在当今信息化社会中,随着智能手机的普及,手机地图应用程序已经成为人们日常生活中不可或缺的工具。这篇开题报告聚焦于开发一个针对武汉市的手机公交线路...
本文档是关于计算机专业相关的外文文献摘要和翻译内容,主要讨论了Microsoft Visual Studio这一集成开发环境...对于希望在Windows平台上进行专业软件开发的计算机专业人员来说,Visual Studio是一个不可或缺的工具。
QT参考手册是面向Qt开发人员的一份详尽的资源,旨在提供全面的...无论是初学者还是经验丰富的Qt开发者,这都是一份不可或缺的参考资料。在实际开发过程中,不断查阅和学习QT参考手册,将极大地提升开发效率和代码质量。
**Android Debug Bridge (ADB)**是Android开发者不可或缺的工具,它为开发者提供了与Android设备或模拟器交互的能力。本文将深入探讨ADB的一些基本命令及其应用场景。 ### **1. ADB安装和配置** ADB作为Android SDK...
另外,文件还可能涉及到存储管理,包括本地文件系统操作、SQLite数据库的使用以及云存储接口的集成,这些都是处理手机应用数据不可或缺的部分。 最后,考虑到智能手机应用的发布和生命周期管理,教程可能会讲解调试...
对于希望将应用发布到Google Play或其他应用商店的开发者来说,这是一个不可或缺的章节。 第十七章专注于Android平板电脑的开发,介绍了平板电脑特有的设计原则和最佳实践。 附录A提供了一些开发者的技巧和关于...