使用HttpWebRequest实现大文件上传
Author:xuzhihong Create Date:2011-06-03 Descriptions: WinForm程序使用HttpWebRequest实现大文件上传 概述: 通常在WinForm程序中都是采用WebClient方式实现文件上传功能,本身这个方式没有问题,但是当需要上传大文件比如说(300+M)的时候,那么WebClient将会报内存不足异常(Out of Memory Exceptions),究其原因是因为WebClient方式是一次性将整个文件全部读取到本地内存中,然后再以数据流形式发送至服务器。本文将讲述如何采用HttpWebRequest方式每次读取固定大小数据片段(如4KB)发送至服务器,为大文件上传提供解决方案,本文还将详细讲述将如何将“文件上传”功能做为用户自定义控件,实现模块重用。 关键词:HttpWebRequest、WebClient、OutOfMemoryExceptions 解决方案: 开始我在WinForm项目中实现文件上传功能的时候,是采用WebClient(WebClient myWebClient = new WebClient();)方式,这大部分情况都是正确的,但有时候会出现内存不足的异常(Out of Memory Exceptions),经常测试,发现是由于上传大文件的时候才导致这问题。在网上查阅了一下其他网友的解决方案,最后找的发生异常的原因:“WebClient方式是一次性将整个文件全部读取到本地内存中,然后再以数据流形式发送至服务器”,详细请参考:http://blogs.msdn.com/b/johan/archive/2006/11/15/are-you-getting-outofmemoryexceptions-when-uploading-large-files.aspx 。按照这个解释,那么大文件上传出现内存不足的异常也就不足为奇了。下面我将讲述如何一步步使用HttpWebRequest方式来实现文件分块上传数据流至服务器。 按照惯例还是先预览一下文件上传最后的效果吧,如下图所示: 界面分为两部分,上面是文件基本信息,下面是文件上传自定义控件,我这里实现的是一个案件上传多个监控视频功能。以下是详细步骤: 第一步:创建用户自定义控件BigFileUpload.xaml 文件上传是一个非常常用的功能,为了所写的程序能非常方便地多次重复使用,我决定将其处理为一个用户自定义控件(UserControl)。 我们先在项目中创建一个FileUpload文件夹,在其目录下新建一个WPF自定义控件文件命名为BigFileUpload.xaml,这样就表示文件上传是一个独立的小模块使用。之所以用WPF自定义控件是因为WPF页面效果好看点,而且我想以后可能大部分C/S程序都会渐渐的由WinForm转向WPF吧,当然创建Window Forms用户控件也是没有问题的。然后我们需要做一个下图效果的页面布局: 前台设计代码如下: <UserControl x:Class="CHVM.FileUpload.BigFileUpload" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="160" Width="480"> <Grid Height="160" Width="480" Background="White"> <Label Height="28" HorizontalAlignment="Left" Margin="16,10,0,0" Name="label1" VerticalAlignment="Top" Width="53">文件</Label> <Label HorizontalAlignment="Left" Margin="15,52,0,80" Name="label2" Width="54">进度</Label> <ProgressBar Height="20" Margin="61,52,116,0" Name="progressBar1" VerticalAlignment="Top" /> <TextBox Height="23" Margin="61,12,116,0" Name="txtBoxFileName" VerticalAlignment="Top" /> <Button Height="23" HorizontalAlignment="Right" Margin="0,10,35,0" Name="BtnBrowse" VerticalAlignment="Top" Width="75" Click="BtnBrowse_Click">浏览…</Button> <Button Height="23" HorizontalAlignment="Right" Margin="0,52,35,0" Name="BtnUpload" VerticalAlignment="Top" Width="75" Click="BtnUpload_Click">上传</Button> <Label HorizontalAlignment="Left" Margin="16,0,0,44" Name="lblState" Width="183" Height="35" […]
View Detailsasp.net中使用HttpWebRequest发送上传文件
一个网站中需要上传一个文件到另一个网站,可以使用HttpWebRequest或者WebClient。 但是WebClient需要首先上传文件到服务器,才能执行发送,不太符合我的需求,这里不再介绍。 通过HttpWebRequest发送的原理: 构建一个HttpWebRequest,通过FileUpload获取要上传的文件,通过字节流发送这个文件,另一个网站接收字节流,保存到服务器。 发送程序: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 //获取要上传的文件信息 byte[]data=fileupload1.FileBytes; stringfileName=fileupload1.FileName; stringfileType=fileupload1.PostedFile.ContentType; stringfileSize=data.Length.ToString(); HttpWebRequest myRequest=(HttpWebRequest)WebRequest.Create("http://localhost:8102/Default.aspx"); myRequest.Method="POST"; myRequest.ContentType=fileType; myRequest.ContentLength=data.Length; myRequest.Headers.Add("FileType",Server.UrlEncode(fileType)); myRequest.Headers.Add("FileSize",fileSize); myRequest.Headers.Add("FileName",Server.UrlEncode(fileName)); using(Stream newStream=myRequest.GetRequestStream()) { // Send the data. newStream.Write(data,0,data.Length); newStream.Close(); } // Get response HttpWebResponse myResponse=(HttpWebResponse)myRequest.GetResponse(); StreamReader reader=newStreamReader(myResponse.GetResponseStream(),Encoding.UTF8); stringcontent=reader.ReadToEnd(); 接收程序: 0 1 2 3 4 5 6 7 8 9 10 stringfileName=Server.UrlDecode(Request.Headers["FileName"].ToString()); stringfileType=Server.UrlDecode(Request.Headers["FileType"].ToString()); intfileSize=int.Parse(Request.Headers["FileSize"].ToString()); byte[]bytes=Request.BinaryRead(fileSize); File.WriteAllBytes(Server.MapPath("~/uploadfiles/"+fileName),bytes); Response.HeaderEncoding=System.Text.Encoding.UTF8; Response.Charset="utf-8"; Response.Write("FileType:"+fileType+";FileName:"+fileName+";FileSize:"+fileSize); FROM:http://blog.bossma.cn/dotnet/asp-net-httpwebrequest-upload-send-file/
View Details8点1氪:亚马逊落户上海自贸区,美国货直邮中国
36氪微信号:wow36kr 亚马逊落户上海自贸区:美国货直邮中国 亚马逊(中国)投资有限公司宣布与自贸区、上海信投达成合作,三方将在自贸区内合作开展跨境电子商务业务,并在自贸区内建立跨境电子商务平台。 三方的合作内容包括:一是建设跨境电子商务平台,为境内外客户购买亚马逊境外网站和中国网站商品提供服务;二是建设物流仓储平台,为中国企业出口商品配送全球提供物流仓储服务;三是利用自贸实验区金融创新政策,优化亚马逊公司融资结构,合作开展跨境电子支付服务; 上海跨境贸易电子商务试点平台,自去年底正式运营以来,目前备案和上线商家已达 32 家,分别来自日本、韩国、澳大利亚、美国、意大利、法国和香港等国家和地区,已进入备案和上线的品种有近万种,形成了一定的品牌集聚效应。 微软推出Windows物联网操作系统预览版 微软现开始向所有 Windows 物联网开发者出货英特尔 Galileo 主板和配套的 Windows 物联网操作系统预览版,并且可以在一系列第三方合作伙伴,如亚马逊,Fry’s 和 newegg.com 购买。 今年早些时候,该公司推出了 Windows 物联网开发者计划,目的是为小物件装上 Windows 操作系统,微软已经向少数指定的开发者出货少量英特尔 Galileo 主板,和相应的特制 Windows 操作系统 Windows 物联网操作系统是一个“Windows8.1 的非商业版本”,预览版的推出,是微软进军物联网计划的一个重要步骤,让制造商和开发人员创建,产生新的想法,并提供反馈,以帮助微软继续改 Windows 物联网操作系统。 谷歌眼镜新专利曝光:与普通眼镜无外观差异 美国专利商标局于 8 月 12 日批准了谷歌一项将用于“可穿戴式显示设备”的外观设计专利。根据该专利提供的草图,未来谷歌眼镜或将不再有置于镜框外右侧的微型显示屏,取而代之的将是一款电子元件全部内置,且从外观看来与普通眼镜并无差异的设备。 专利持有人 Heinrich 在其个人网站上对该项专利的描述为:“早期机械结构布局。为有关设备的发布引导消费商品包装的开发。考虑了人类因素和物理模型,以适应更多的人配戴。结合了骨传导音频系统,包括元件设计和测试等。大量的高保真和低保真原型开发。” 专利适用于“可穿戴式显示设备”,从外观看与普通眼镜框无明显差异。与当前谷歌眼镜相比,新设计将外置的显示屏幕放在了右侧镜框的内部。 三星首款Nook平板电脑巴诺开卖 三星今天与 Barnes&Noble 联手发布了 Galaxy Tab 4 Nook 平板电脑。这款产品基本上是三星现有 Galaxy Tab 4 平板电脑更名产品,并且预装了一些 Nook 定制软件,该平板电脑拥有 7 英寸显示屏,分辨率 1280×800,售价 179 美元,和三星 Galaxy Tab 4 平板电脑现有价格基本相同。 Barnes&Noble 于 2012 年发布自己的平板电脑,但很快了结相关业务,前后不到一年时间,Nook 平板电脑亏损让 Barnes&Noble 季度财报难堪,以至于它最终宣布剥离该部门,该部门目前专注于电子书阅读器产品。 亚马逊 Kindle Fire HD 平板电脑只卖 139 美元,而 HDX 版本售价为 229 美元。不过,Nook 平板电脑允许访问完整的谷歌 Play 商店,这意味着应用程序选择将远远超过你亚马逊的平板电脑。 传亚马逊将在印度测试无人机送货服务 […]
View Details提升你网站水平的的前端交互效果【附源码】
这里集合的这组 HTML5 & CSS3 效果,有的是网站开发中常用的、实用的功能,有的是先进的 Web 技术的应用演示。不管哪一种,这些案例中的技术都值得我们去探究和学习。 超炫的 HTML5 粒子效果进度条 我喜欢粒子效果作品,特别是那些能够应用于实际的,例如这个由 Jack Rugile 基于 HTML5 Cavnas 编写的进度条效果。看着这么炫的 Loading 效果,即使让我多等一会也无妨:) 源码下载 / 在线演示 使用 CSS3 打造一组质感细腻丝滑的按钮 CSS3 引入了众多供功能强大的新特性,让设计和开发人员能够轻松的创作出各种精美的界面效果。下面这些发出闪亮光泽的按钮,很漂亮吧?把鼠标悬停在按钮上,还有动感的光泽移动效果。 源码下载 / 在线演示 纯 CSS 绘制《辛普森一家》人物头像 一组纯 CSS 绘制的《辛普森一家》人物头像。《辛普森一家》(The Simpsons)是马特·格勒宁为美国福克斯广播公司创作的一部动画情景喜剧。 源码下载 / 在线演示 CSS & jQuery 制作一款漂亮的多彩时钟 大家可能见过各种各样的时钟效果,比如多年前非常流行的 Flash 制作的各种新奇的动画时钟,现在的 Web 开发者们又开始应用 CSS3 和 Canvas 等最新技术来实现。 源码下载 / 在线演示 傻眼了!竟然有如此逼真的雨滴效果 Rainyday.js 是一个轻量的 JavaScript 库,利用 HTML5 Canvas 实现雨滴下落在玻璃表面的动画效果。Rainyday.js 尽可能的模拟现实的雨滴效果,几乎可以以假乱真了。 源码下载 / 在线演示 HTML5 Canvas 模拟可撕裂布料效果 这是一个模拟可撕裂布料效果的 HTML5 Canvas 应用演示,效果逼真。你会看到,借助 Canvas 的强大绘图和动画功能,只需很少的代码就能实现让您屏息凝神的效果。 源码下载 / 在线演示 SVG 实现一个漂亮的页面预加载效果 展示如何使用 CSS 动画, SVG 和 JavaScript 创建一个简单的页面预加载效果。对于网站来说,这些预载入得画面提供了一种创造性的方法,使用户在等待内容加载的时候不会那么无聊。 源码下载 / 在线演示 结合 CSS3 & Canvas 模拟人行走的效果 HTML5 和 CSS3 […]
View Details8个前沿的 HTML5 & CSS3 效果【附源码下载】
作为一个前沿的 Web 开发者,对于 HTML5 和 CSS3 技术或多或少都有掌握。前几年这些新技术刚萌芽的时候,开发者们已经使用它们来小试牛刀了,如今这些先进技术已经遍地开发,特别是在移动端大显身手。这篇文章挑选了8个前沿的 HTML5 & CSS3 效果,记得收藏哦:) 温馨提示:为保证最佳的效果,请在 IE10+、Chrome、Firefox 和 Safari 等现代浏览器中浏览。 HTML5 模拟现实物理效果 Ball Pool 是一个基于 HTML5 技术的实验,模拟现实物理效果,让你在 Web 中感受自然物体的运动。玩法介绍:可以随意拖动圆球、点击页面背景、晃动浏览器、双击页面背景或者按住鼠标左键,有不同的效果,赶紧来体验一下。 源码下载 在线演示 实现各种 CSS3 文本动画效果 这个插件集成了一些非常好的 JavaScript 库,提供一个方便使用的文本动画插件,可以让你为网页中的文字运用各种动画。 在线演示 源码下载 离开你网站时显示模态弹窗 Ouibounce 是一个微小的库,用于实现在用户离开你的网站的时候显示一个模式窗口。这个库可以帮助你增加着陆页的转换率。 Ouibounce 会在当鼠标光标移动到接近(或通过)视口(viewport)的顶部的时候触发。 源码下载 在线演示 实现各种好看的阴影效果 Shine.js 是一个用于实现漂亮阴影的 JavaScript 库。您可以设置动态光的位置,可定制的阴影。不依赖于第三方库,兼容 AMD。能在支持 textShadow 或 boxShadow 的浏览器中正常使用,如果有需要会自动添加前缀。 源码下载 在线演示 表单填写进度提示效果 Fort.js 是一款用于时尚、现代的表单填写进度提示效果的 JavaScript 库,你需要做的就是添加表单,剩下的任务就交给 Fort.js 算法了,使用非常简单。提供了Default、Gradient、Sections 以及 Flash 四种效果,满足开发的各种场合需要。 源码下载 在线演示 HTML5 WebGL 实现逼真的云朵效果 使用 HTML5 WebGL 实现超逼真的云朵效果。WebGL 是一项在网页浏览器呈现3D画面的技术,有别于过去需要安装浏览器插件,通过 WebGL 的技术,只需要编写网页代码即可实现3D图像的展示。 源码下载 在线演示 带有数字显示的加载进度条效果 有的时候,在我们的应用程序中,我们希望能够显示特定任务的百分比进度。这里分享的这款小巧的 JavaScript 插件就是实现这个功能,易于使用和定制,而且是是免费开源的。 立即下载 在线演示 自适应的占位符效果 在早期,我们都是通过使用 JavaScript 来实现占位符功能。而现在,HTML5 原生提供的 placeholder 属性让我们在现代浏览器轻松就能实现这样的功能。这里向大家分享一个自适应的占位符效果(Adaptive Placeholder),当你输入的时候,提示文字不会消失,而是以动画的方式移动到了输入框的上方。 源码下载 在线演示
View Details你知道创业公司都在使用什么技术吗?
每天都会有很多新语言、数据库等的炒作。但是究竟实际在使用的技术有哪些?好的初创企业使用的技术会不会跟不那么好的那些所使用的技术有所不同呢? AngelList 的自我报告可以为我们揭示部分答案。从里面你可以发现,Robinhood 用 Python、Django 和 iOS;Secret 用 Java、Go、Python、JavaScript、HTML5、CSS、iOS 及 Android 等。 AngelList 把这些企业分成 3 档,一档是“过得去”,其使用的技术用蓝色表示;一档是“好”,用红色表示;最后一档是“极好”,用橙色表示。然后分析了各档公司在编程语言、前端技术、 数据库 / 存储 / 缓存、移动技术、基础设施、DevOps、API 集成、先进技术、大数据软件等方面的使用情况。从中可以看出,各类技术的总体趋势是: 最热门编程语言:Ruby on Rails 最热门前端技术:JavaScript/Node.js 最热门存储技术:MySQL、MongoDB 最热门移动技术:iOS 最热门基础设施:AWS 最热门DevOps: Chef 最热门搜索技术:Elastic search 最热门API集成:Facebook API 最热门先进技术:大数据 最热门大数据软件:Hadoop 编程语言 JavaScript/Node.js、Ruby/Ruby on Rails、Java 是各类公司都喜欢使用的技术;PHP 和 Python 则在好中差三类公司间形成反差:越“好”的公司越喜欢用 Python,越“差”的公司越喜欢用 PHP。 前端技术 除了最火的 Ruby on Rails 技术以外,HTML5 和 CSS 技术也是被大量采用的技术。而 Bootstrap 这个框架则是越好的公司越少采用。 数据库/存储/缓存 MySQL、MongoDB、Postgres SQL 统治了数据库领域,相比之下,SQL Server 和 Oracle 的使用则少很多。 移动技术 iOS 稍微比 Android 热门一点,而且越好的公司越多采用 iOS,WindowsMobile 由于体量太小(小 30 倍到 50 倍),所以连图都不上了。 基础设施/托管 AWS 和 Heroku 占据了统治地位,越好的公司越倾向于采用 IaaS(如 AWS)而不是 PaaS(如 Parse),也许是出于自身技术实力和更好定制调优的需要? DevOps工具 除了 Chef […]
View Details为什么 35 岁的 C++ 仍在“真实”开发中占主导
早在1979年,Bjarne Stroustrup设计了C++编程语言,并且C++很快成为了无处不在的通用系统编程语言。现在尽管有Java、Javascript、Python、Go,甚至是苹果的Swift和它竞争,但C++依然处于主导编程世界的地位。 今天在Morgan Stanley的科技访谈会上,InfoWorld的编辑和Stroustrup畅聊了很多关于C++的问题,还谈及了其他的编程语言,包括Google的Go语言和苹果的Swift语言。以下是我们的访谈记录。 InfoWorld: 您是怎么看C++的未来的?现在有很多流行的脚本语言,像Python和Javascript,当然还有很受欢迎的Java,甚至是Google的Go语言,C++如何从这么多编程语言中存活下来,并且发展壮大? Stroustrup: 这是个很棒的问题。在这 20年时间里,人们一直在预测C++将会灭亡,但是很高兴的是它一直在成长和壮大。如果你进入到嵌入式领域,如果你想做一些复杂的图像处理,如果你需要实 现一些微电子应用,如果你要开发一些金融管理系统,那么C++是你的首选。也许你很少能看到C++的身影,但是在那些应用的底层,C++依然是撑起整个应 用的顶梁柱。比如Google、Amazon、搜索引擎等那些需要高性能的地方,C++就成了不可或缺的重要角色了。 InfoWorld: Google的Go语言越来越被受到关注,您对Go语言的前景怎么看? Stroustrup: 当然这些编程语言可以非常优雅地实现一些功能,但是这些编程语言关注的是如何让写代码变得便捷和优雅,却损失不少性能。当然,这些编程语言所做的贡献我们也是有目共睹的。 InfoWorld: 一些脚本语言的宗旨是解放程序员的双手,那么C++是否也会逐渐倾向于这个目标? Stroustrup: Oh,当然了。C++主 要是为一些相当底层核心的应用设计的,它也经常会和其他的脚本语言结合使用。一开始的时候,我是用C++来实现任何的应用,然后我就在Unix上使用 shell作为脚本语言设计一些底层应用。C++涵盖了以下优秀的特性:高性能、易伸缩、占用空间小、占用资源少等等。 InfoWorld: 苹果在今年6月份发布了Swift语言,您是否认为由于苹果公司的支持,Swift将越来越受到开发者的关注? Stroustrup: 我认为是的,之前他们关注Objective-C,这回Swift真正进入了这些开发者的领域了。 InfoWorld: C++面临两大挑战:一方面要满足开发者实现高性能、可扩展、搞可靠性的应用程序,另一方面又需要能够帮助开发者实现可维护的代码。关于这两个问题您怎么看? Stroustrup: 我正要解释这两个问题,第一个问题是要尽可能的抽象和更高效地利用硬件资源,而后者则需要能尽可能简化代码的编写过程,从C++ 11到C++ 14,已经具备这样的兼顾能力了。 今年我们会发布一个新的C++版本,它参考了C++ 14的标准。当你在研发大型的产品时,也许C++ 11在某些方面已经无法满足你的需求,但当出现C++ 14时,情况就会完全改变了,C++总是在不停地进步着。 InfoWorld: 关于程序的安全性问题,您怎么看?程序员是否需要关注所有的安全问题?C++是否比其他编程语言安全呢? Stroustrup: 我非常热衷于解决硬件的安全问题。在编程语言方面,如果你想编写优秀的程序,那么你的代码一定要确保类型安全。你可以在C++中实现这一要求。不要总是围绕着一些低效的功能转,总的来说,安全问题是系统问题。 InfoWorld: 您是否还要探讨关于C++或者软件开发的其他任何问题? Stroustrup: 我们的目标是让软件开发更加专业化。我们的社会中很多事情都是不能被打破的,其中大部分都需要依赖软件。作为开发者,我们需要整体考虑到我们的系统,编程语言和开发工具只是其中的一部分,我们需要探究如何培养开发者,以及如何将重点放在程序的可靠性上。 原文出处: infoworld 译文出处:codeceo from:http://www.oschina.net/news/54556/stroustrup-why-the-35-year-old-c-still-dominates-real-dev
View Details简短介绍 C# 6 的新特性
几周前我在不同的地方读到了有关C#6的一些新特性。我就决定把它们都收集到一起,如果你还没有读过,就可以一次性把它们都过一遍。它们中的一些可能不会如预期那样神奇,但那也只是目前的更新。 你可以通过下载VS2014或者安装这里针对visual studio2013的Roslyn包来获取它们。 那么让我们看看吧: 1. $标识符 $的作用是简化字符串索引。它与C#中那些内部使用正则表达式匹配实现索引的动态特性不同。示例如下: ? 1 2 3 4 5 6 7 8 9 10 11 var col = new Dictionary<string, string>() { $first = "Hassan" }; //Assign value to member //the old way: col.$first = "Hassan"; //the new way: col["first"] = "Hassan"; 2. 异常过滤器 VB编译器中早已支持异常过滤器,现在C#也支持了。异常过滤器可以让开发人员针对某一条件创建一个catch块。只有当条件满足时catch块中的代码才会执行,这是我最喜欢的特性之一,示例如下: ? 1 2 3 4 5 try { throw new Exception("Me"); } catch (Exception ex) if (ex.Message == "You") 3. catch和finally块中await关键字 据我所知,没有人知道C# 5中catch和finally代码块内await关键字不可用的原因,无论何种写法它都是不可用的。这点很好因为开发人员经常想查看I/O操作日志,为了将捕捉到的异常信息记录到日志中,此时需要异步进行。 ? 1 2 3 4 5 6 7 8 try { DoSomething(); } catch (Exception) { await LogService.LogAsync(ex); } 4. 声明表达式 这个特性允许开发人员在表达式中定义一个变量。这点很简单但很实用。过去我用asp.net做了许多的网站,下面是我常用的代码: ? 1 2 3 long id; if (!long.TryParse(Request.QureyString["Id"], out id)) { } 优化后的代码: ? 1 2 if (!long.TryParse(Request.QureyString["Id"], out long id)) { } 这种声明方式中变量的作用域和C#使用一般方式声明变量的作用域是一样的。 5. Static的使用 这一特性允许你在一个using语句中指定一个特定的类型,此后这个类型的所有静态成员都能在后面的子句中使用了. ? 1 2 […]
View Details10 个适合网店使用的免费 Bootstrap 模板
Studio Flatti Shopper Sell Anything Colorful Flat Purpose Siimple Landing page Progressus Minimal Theme via templatespicy from:http://www.oschina.net/news/54521/best-free-bootstrap-templates
View DetailsAndroid之SQLiteOpenHelper应用
1.SQLiteOpenHelper SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理。要使用它必须实现它的nCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)方法 onCreate:当数据库第一次被建立的时候被执行,例如创建表,初始化数据等。 onUpgrade:当数据库需要被更新的时候执行,例如删除久表,创建新表。 2.实现代码 package xqh.utils; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; public class DBHelper extends SQLiteOpenHelper { //数据库版本 private static final int VERSION = 1; //新建一个表 String sql = "create table if not exists TestUsers"+ "(id int primary key,name varchar,sex varchar)"; public DBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } public DBHelper(Context context,String name,int version){ this(context,name,null,version); } public DBHelper(Context context,String name){ this(context,name,VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } 3.SQLite的使用 Android提供了一个名为SQLiteDatabase的类,它封装了一些操作数据库的API。使用它能实现基本的CRUD操作,通过getWritableDatabase()和getReadableDatabase()可以获取数据库实例。 4.实现代码 package xqh.sqlite; import xqh.utils.DBHelper; import android.app.Activity; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.widget.Button; import android.util.Log; import android.view.View; import android.view.View.OnClickListener;; public class TestSQLite extends Activity { Button textBtn = null; Button btnCreateDb = null; Button btnCreateTb = null; Button btnInsert = null; Button btnUpdate = null; Button btnDelete = null; DBHelper dbHelper = null; SQLiteDatabase db = null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.sqlitetest); OpenDb(); textBtn = (Button)findViewById(R.id.btnHeader); textBtn.setFocusable(true); // btnCreateDb = (Button)findViewById(R.id.btnCreateDb); // btnCreateDb.setOnClickListener(createDbListener); // // btnCreateTb = (Button)findViewById(R.id.btnCreateTb); // btnCreateTb.setOnClickListener(createTbListener); btnInsert = (Button)findViewById(R.id.btnInsert); btnInsert.setOnClickListener(insertTbListener); btnUpdate = (Button)findViewById(R.id.btnUpdate); btnUpdate.setOnClickListener(updateTbListener); btnDelete = (Button)findViewById(R.id.btnDelete); btnDelete.setOnClickListener(deleteTbListener); } public OnClickListener deleteTbListener = new OnClickListener() { public void onClick(View v) { DeleteTb(); } }; public OnClickListener updateTbListener = new OnClickListener() { public void onClick(View v) { UpdateTb(); } }; […]
View Details