欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx

    • 资源ID:891602       资源大小:180.75KB        全文页数:15页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx

    数据库课程设计美食主题安卓系统菜谱查询应用程序CookBook目录一、麒要求2二、选题背景3三、需求分析3四、削理念3五、开发工具7六、实现步骤7七、结果15八、总结与体会15课题主题美食菜谱一、选题要求以美食为主线,最好与健库和互联网,移动互联网相关,开发一个小应用程序或者小系统。可参考如下一些相关的美食网站:广州美食团购:http:gz.meituan.Comcategorymeishiall?UtmqmPaigr=I344091295&utmmedium=cpc&utmsource=baidu&utmcoment=PinIei&utmterTn=%E7%BE%8E%E9%A3%9F%E5%9B%A2%E8%B4%AD%E7%BD%91京东美食:http:WWW二、选题背景随着人们生活水平的普遍提高,对餐饮娱乐业的服务、硬件设施、菜品口味的要求越来越挑剔。加上原材料的不断上涨,人工成本越来越高以及越来越多食品安全丑闻的曝光,自己动手做菜成了现代生活的最佳觅食手段。自己动手做菜,则不仅要保证色香味俱全,还要营养价值丰富。那么方便查阅的菜谱必不可少。一份方便的菜谱,不仅要让用户能够根据食材和菜名快速的找到相关菜肴,还要对菜肴有详细的介绍,对做菜的步骤有详细的说明。除此之外,还要有方便快捷的信息统计功能,如菜谱所需食材的统计、食材总价的估算、当季热门菜谱的推荐、用户收藏夹的查阅等等功能来帮助用户快捷的使用菜谱。本应用程序就是希望通过向大众提供营养的食谱,向更多的关注健康的人们提供一个吃出健康的好环境。它的服务又掇是非常广泛的,前景十分广阔。三、需求分析这里主要描述客户需求1 .登陆/注册账号2 .根据菜谱名称或者食材进行模糊搜索3 .点击搜索返回结果以查看菜谱详细内容菜谱详细内容包括:3.1. 菜谱图片一张32少于200字的菜式简介3.3. 适合人数,消耗时间3.4. 食材(包括配料)名称、用量3.5. 若干步骤36用户评价4 .收藏菜谱5 .丽介菜谱6 .将菜谱食材加入购物清单7 .查看购物清单(包含食材名字、用量、总价)8 .清空购物清单9 .查看个人收藏四.设计理念1.系统逻辑谢十2.数据库设计2.1. E-R图2.2.关Ingredient?w2.3.数据字典PC-20140404KILC.kBookDB-dbo.DishPC-201404列名 Did Dname DintrodurtonDpic DtimeCost Dpeople Dhot数据类型 int nvarchar(20) nvar char (200) vardar(30) tinyint tinyint int允许NUl值DdateSmalldate tme列名数据类组允许Nul值intUnamenvar char(10)Upasswordnvar char (20)iPC-20140404KILC.ookDB - dbo.Users PC-2014040PC-20140404KILC.B - dboJngredient PC-20140404列名数据类数一不泮NuI值3ntInamevardar(10)Ipricenumeric(4, 1)Iunitnvarchar(2)PC-20140404KILC.B - dbo.Seasoning SQLQueryl.s列名额据类空-充*2值?nintSnamenvarchar(8)PC-20140404KIIDB - db。.CommentS PC-一201PC-20140404KILCo dboJngredientList PC-20140/列名数据类汇允许NuI值皿intEIidint0!amountnumehc(Sf 2)PC-20140404KILCo.dbo.SeasoningListPC-2014O列名数据类型允许NUll值IntDidIntESanxxjntnchar(5)列名数据类型允许Null值用 CidlintPC-20140404KILC.-Ccontentnvardar(200)列名Cdatesmalldatetime UidlDidintCidPC-20140404KILC.ookDB - dbo.Steps PC-2014040PC-20140404KILC.-列名数据类空允许Nul值StepIDint0列名DidintOSaxitentnvarchar(200)IrlDid2.4.建表语句db。.CommentLiSt PC-201404C数据类受痴NuH值Int口int口Odbo.BookmarkList PC-201404数据类型福NUIl值useCookBookDBgcreatetableDish(Didintprimarykeynotnull,Dnamenvarchar(20)notnull,Dintroductionnvarchar(200)notnulldefault,暂无介绍:Dpicnvarchar(30).DtimeCosttinyintnotnull,Dpeopletinyintnotnull.DhotintnotnulldefaultO.DdateSmalldatetimenotnulldefaultgetdate();createtableIngredientfIidintprimarykeynotnull,Inamenvarchar(10)notnull,!pricenumeric(4.1)notnull.Iunitnvarchar(2)notnull);createtableSeasoning(SidintPrimarykeynotnull.Snamenvarchar(8)notnull);createtableComments(Cidintprimarykeynotnull.Ccontentnvarchar(2()0)notnullCdateSmalldatetimenotnull.Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade);createtableSteps(StepIDintprimarykeynotnull,Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade.Scontentnvarchar(2(X)notnull);createtabicIngredientList(Iidintnotnullforeignkey(Iid)referencesIngredient(Iid)ondeletecascade.Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade,!amountnumeric(5,2)notnull);createtableSeasoningList(Sidintnotnullforeignkey(Sid)referencesSeasoning(Sid)ondeletecascade.Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade.Samountnchar(5)notnull一比如'一茶匙')createtableUsers(Uidintprimarykeynotnull,Unamenvarchar(10)notnull,Upasswordnvarchar(20)notnull.)createtableBookinarkLisKUidintnotnullforeignkey(Uid)referencesUsers(Uid)ondeletecascade.Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade.)createtableCommentList(Uidintnotnullforeignkey(Uid)referencesUsers(Uid)ondeletecascade.Cidintnotnullforeignkey(Cid)referencesComments(Cid)ondeletecascade.五.开发工具环境:SQLsevermanagementstudio2008xeclipse.VisualStudio2010语言:SQL、java、C+工具包:AndroidSDK、ADO组件六.实现步骤6.1客户端实现:1 .设计程序界面:在纸上画出草图,确定每个功能应该在什么界面实现2 .Android编程:在装有ADT的eclipseIDE中进行编程,实现页面布局设计、页面间跳转、请求数据、显示返回数据等需求分析中提到的功能。其中,实现页面布局设计是我们对ADT中的布局文件进行了编写,页面间爵炼专以及请求和返回数据我们是通过intent来相互传送,其中核心步骤的代码为:加VerrIdepublicvoidonItemClick(AdapterView<?>argQ,Viewargl,intarg2,longarg3)TODOAuto-generatedmethodstubIntenti=newIntent(Homepage.this,detailinfo.class);listdatadata=adapter.getltem(arg2);|/Toast.makeText(this,data.name,Toast.LENGTH_SHORT).show();i.putExtra("txt",data.Did);startActivity(i);在首页的GridView网格视图中任意点击一个item,都能传输菜的id(即上图中的Did)到客户端,客户端连接以及得到id这个参数的核心代码如下,然后服务端根据id作为key搜索数据库,并返回菜谱的内容。publicvoidonClick(Viewarg)TODOAuto-generatedmethodstubif(iSConnecting&&mSocketCIient!=null)StringmsgText=getlntent().getStringExtra("txt");取得编辑框中我们输入的内容if(msgTe×t.length()<=0)Toast.mfeext(mContext,”获取字符不能为空!,Toast.LEN6TH-SH0RT,).show();)elsetrymPrintUriterCLient.print(msgText);/发送给服务器mPrintWiterCHent.flush();)catch(Exceptione)/TODO:handleexceptionTOaSt.mAeText(mContext,”发送获取字符异常:"+e.getMessage(),Toast.LENGTH_SHORT").she)33,SQLite数据库我们在客户端APP加入了一个小型便捷的数据库SQLite,用于储存用户的登陆信息。这是一个直接存储在客户端的本地数据库,不涉及到通过网络传播的作用,每当有用户登陆的时候,就在数据库中寻找匹配的项目(用户名,用户密码等),如果找到匹配的信息,就登陆成功,进入下一个界面,否则,登录失败。对于这个数据库,考虑到信息都保存在本地,数据库的规模不宜过大,因此只存储基本的用户信息和登陆记录,便于查找信息。建立数据库的语句如下:+importandroid.content.ContentValuesjfpublicclassUserDatabaseextendsSQLiteOpenHelper(publicfinalStringTABLEeNAME=*usero;publicfinalStringUSEReID-publicfinalStringUSERmNAME«"u-name,t;publicfinalStringUSER.PASSWORD="j>assword"publicfinalStringUSER_SEXMu_sex"publicfinalStringUSEReHOBBY=*uhobby"publicUserDatabase(ContextcontextStringnameCursorFactoryfactoryintversion)super(context,naae/factory,version);/ToOoAuto-generatedconstructorstubOverridepublicvoidOnCreate(SQLiteDatabaSedb)/TOOOAuto-generatedmethodstubStringsql="CREATETABLE'+TABLE_NAME+M("+USER-ID+"integerprimarykey,"+USER二NAHe+"textnotnull,"+USER_PASSWORD+',textnotnull,"+USER_SEX+_textnotnull,"+USER_H0B8Y+-textdb.e×ecSQL(sql);init_database(db);)4.Socket网络通信(1)建立通信我们的项目里面包括一个服务端和一个客户端,菜谱的数据保存在服务端,客户端如果想要获得服务端的数据,就必须通过网络获取数据,这里我们使用socket通信,在客户端,我们指定输入服务器的IP和Port,更具客户需求,建立通信,连接服务器的代码如下:try/手及著务导mSocketClient=newSocket(sIP,port);pQrtnUm/尊(W人.战力&InBufferedReaderCLient-newBufferedReader(newInPUtStreamReader(mSocketClient.getInputStream(),"GB2312");OutputStreaBoutput-BiSocketClient.getOutputStream();/5三SS三*三54Writerwriter=newjava.io.OutputStreanWriter(output,"UTF_8");mPrintUr<.terCLient=newPrintWriter(writer,true);/F5ClientrecvMessageClient-"=三server!n',jl!*ftlfMessagemsg-newMessage();msg.what-1;mHandler.SendHessage(Bsg);/break;catch(Exceptione)PecvMessageClient-÷e.toString()+e.getMessage()÷W;蹲电蛾栏Messagemsg«newHessage();msg.wht=1;mHandler.sendHessage(sg);return;)使用BufferReader和PrintWriter两个函数完成数据的读写。每次当客户端需要从服务端获取信息的时候,就向服务器发送一个请求,请求中包含对想要获取的信息的说明;收到请求之后,客户端解析请求,并将客户端需要的信息分段发送给客户端,客户端持续监听,当客户端收到服务端发送的结束符号后,完成一次通信。通过BUfferReader获取数据:while(IsConnecting)try/if(TecvMessageClient=BBufferedReaderClient.readLine()!=null)if(count-IBBufferedReaderCLient.read(buffer)>0)(PecvMenuClient=getInfoBuff(buffer,count);/:”矣W/支W个tiH入比Bc析绛欲鎏立是不是一个民忘StoreString+=CecvMenuClient;Messagemsg-newMessage。;msg.what=2;InHandler.sendHessage(sg);catch(Exceptione)(CecvMessageClient="SJs:"+e.getMessage()+"n"/=三isMessagemsg-newMessage();nsg.what=1;Handler.sendMessage(msg);)通过PrimWriter发送数据:if(isConnecting&&InSocketClient!=null)StringmsgText="$21.txt"取弟企艳猥=却灌入?j:容if(msgTe×t.length()<=0)(Toast.>feeext(mContext,"?E装字符不楂方空:,Toast.LENGTH_SHORT).show();else(try加PrintlriterCttent.print(msgText)发送j芸务第mPrintriterCLient.flush();)catch(Exceptione)(T(XX):handleexceptionToast.znfeeext(mContext,"比!东率字号舁常:"+e.getMessage(),Toast.LENGTH_SHORT).show();else(Toast.wfeeText(mContext,Joast.LENGTHSHORT).show();)除此之外,由于安卓对于SoCket有特殊的要求。安卓为了保证主线程的安全,需要所有的SOCket连接和信息传输的工作都要在分线程上完成,所以每当需要显示的数据时候,我们就需要调用handler函数,在线程外部完成信息的输出,具体实现如下:HandlermHandler三newHandler()(publicvoidHandleMessage(Messagemsg)super.HandleMessage(msg);if(msg.what=0)(recvMenu.append(recvMenuClient);/N)if(msg.what=三1)recvTe×t.append(,*Client:"+recvMessageClient);/呈产if(msg.what=2)(recvText叩Pend("checked!");recvMenu.append(“交5:至举n");StringTempl三recvMenuClient.split("$FLAG*);recvMenu.append(',j(g:"+Templl+,n");recvMenu.append("g="+Templ2+"n");recvMenu.append("步3L"+Tempi2+"n"recvMenu.叩Pend("夏归',+Templ3+,*n"););(2)分析接收到的内容在接收到服务端发送的数据之后,客户端必须有分析收到接收到的信息的能力,即必须能够通过判断分隔符的方式,将接受到了一类字符串短程一段段有意义的字符,并将这些字符分别储存在不同的地方,或者显示出来。(3)根据不同的需求,向服务端发送不同的数据客户端必须根据不同的客户需求向服务端发送不同的符号,服务器识别这些符号之后,会根据客户的需求发送不同的信息,这里为了方面,每当客户点击菜品目纸到菜谱页面的时候,我们就返回一个菜品的ID,具体的实现如下:OverridepublicvoidonItemClick(AdapterView<?>arg0,Viewargl,intarg2,longarg3)/TODOAuto-generatedmethodstubIntenti=nevIntent(Homepage.thisjdetailinfo.class);listdatadata=adapter.getltem(arg2);|/Toast.makeText(this,data.name,Toast.LENGTH_SHORT).show();i.putExtra("txt",data.Did);startActivity(i);6.1客户端实现:服务端主要任务是,根据客户端的请求处理数据库,或从数据库调出数据。这是一种安全的访问数据库方式,因为客户端并没有直接通过SQL语句访问数据库,而是通过服务端;客户端与服务端间的通信采用非明文的协议模式,不存在SQL注入等语法攻击。1.Socket通信的实现既然要客户端和服务端间通信,我们想到了用Socket的办法。Socket是套接字,用于通信双方的识别,下面是SoCket的建立过程。boolinit-socket()WSADatadata;WORDWVersion=MAKEWORD(2,2);if(WSAStartup(wVersion,&data)(=0)returnfalse;if(LOBYTE(data.wVersion)!=2HIBYTE(data.wVersion)!=2)returnfalse;returntrue;sock_sevr=socket(AF_INET,SOCK_STREAM,0);if(socksevr三三INVALID,SOCKET)cout«”CantCreateServerSocket!*«endl;returnfalse;addr_sevr.sin-addr.s_addr=htonl(ADDR_ANY);addr_sevr.sin_family=AF_INET;addr_sevr.sin_port=htons(DEFAULT_PORT);addr_len三sizeof(addr_sevr):if(bind(sock_sevr,(constsockaddr*)&addr_sevr,addr_len)三=SOCKET_ERROR)Write_msg("ServerBindAddressFailed!a,);returnfalse;voidServer:close-server()closesocket(sock_sevr);WSACleanupO:CoUninitializeO:2 .服务端多线程作为服务端,不可能只为一个客户端服务,因此在这里又要涉及到多线程的实现。我们采取的办法是,主线程用于监听,一旦有远端SoCket接入,新建一个线程去处理这个连接请求,并把Server对象、接入的SoCket作为参数传进这个线程。voidServer:start_listen()while(true)cout<<*n*:SOCKETsock三SOeKET_ERROR:structsockaddr_inaddr_client;mtclient_addrlen=this->addr_len;while(sock=INVALID.SOCKET)sock=accept(sock_sevr,(sockaddr*)&addr_client,&client_addrlen);DWORDtid;ThreadParam*para=newThreadParam(*this,sock,addr_client);CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ServerWorkProc,param,0,if(!tid)Write_msg("CreateServerWorkingThreadFailed!*);服务端在线程中主要任务是监听客户端的请求:do(msg_len=recv(sock,buffer,IttIXJKESSAGE,O);*1½处接收来自客户端的消息*if(msg_len>0)pts.writensg(buffer);*将此消直显示»/stringcmd(buffer);Requestreq(cmd):3 .AD0连接数据库由于服务端是需要调用SQLserver的数据库,并以流的方式通过Socket传到客户端,因此我们需要一些数据库组件来完成这个调出数据的过程。ADO是一种程序对象,用于表示用户数据库中的数据结构和所包含的数据。在MiCrOSOftViSUalBaSiC编辑器中,可以使用ADO对象以及ADO的附加组件(称为MicrosoftADOExtensionsforDLLandSecurity(ADOX)来创建或修改表和查询、检验数据库、或者访问外部数据源。还可在代码中使用ADO来操作数据库中的数据。以下分别是连接数据库,以及访问数据库实现登陆检测的代码boolServer:init_database()HRESULThr三S_OK;try(CoInitialize(NULL);StrCnn="PrOvider=SQLOLEDB;PersistSecurityInfo=False;UserID=sa;PasswordiPRstAuthors=NULL;pConnection=NULL;if(FAILED(pConnection.CreateInstance(_uuidof(Connection)printf(*Failedcreatingconnectioninstancen*);returnO;if(FAILED(pRstAuthors.CreateInstance(_uuidof(Recordset)cerr<<vDatabaseError:Failedcreatingrecordsetinstance"”:returnfalse;)catch(_com_error&ce)cerr<<*InitError:%sn,ce.DescriptionO;returnfalse;)returntrue;)boolServer:slogin(Requestr)stringid=r.getKey()0;stringpwd=r.getKey()1;try(stringsqlStr="SELECTUsers.UpasswordFROMUserswhereUsers.Uname=w+id;pRstAuthors->0pen(sqlStr.c_str(),strCnn,adpenStatic,adLoCkReadOnly,adCmdText);_bstr_tval;pRstAuthors->MoveFirst();val=pRstAuthors->Fie1ds->Get11em(*Upassword")->Value;if(pwd=(char*)val)returntrue;)catch(_com_error&ce)cerr<<*LoginError:%sn*,(char*)ce.DescriptionO;returnfalse;)returnfalse;)4 .建立SQL数据库为了测试,我们先建立一个简单的表格,下面是建表语句:createtableUsers(Uidintprimarykeyidentity(l,l)notnull,Unamenvarchar(10)notnull,Upasswordnvarchar(20)notnull,createtableDsh(Didnvarchar(3)primarykeynotnullzDnamenvarchar(20)notnull,introductionnvarchar(200)notnulldefault'暂无介绍',Dpicnvarchar(200),Dstepsnvarchar(200)notnull,Dmaterialnvarchar(200)notnull,);createtableBookmarkList(Uidintnotnullforeignkey(Uid)referencesUsers(Uid)ondeletecascade,Didintnotnullforeignkey(Did)referencesDish(Did)ondeletecascade,5 .客户端/服务端协议,分析指令。为了节省流量,也为了通信的安全性,我们建立了客户端和服务端之间的协议,用代码和参数形式格式化传递请求和数据:< $1>userid!$FLAGpwd$Coinplete<#11><#10>< $2>name$FLAGpwdJComp1ete< 21>useridJCoirplete<#20>< $3>dname¢Complete< 3>A1$FLAGA2$FLAGA3KolnPIete< J4>dnameJCoinplete< $40>dnameJCowleteClient->ServerServer-ClientServer->ClientClient->ServerServer->ClientServer-X?lientClient->ServerServer->ClientClient->ServerClient->Server登登登注注注靠路录录录册册败功功咨果藏七、结果ece%gn"34Cookfinal用户名Cd14ft男女»计机C泳L乒乓獐注册取消er.CookfinalEwG2输入菜港或食材1)注册界面2)登陆界面3)主页面125.216.246.121:2222-Mooiwifi查找英谱获取菜谱收藏菜谱承而显示菜安普介:IIMi6荷兰豆的一般做法是用广式小Hi.其实四川的传统餐膈也有广味的.放人的没有广式小Hi那么多,再溯上用空气炸祸里任的加惊(»的油分也会出去好多.这是比W健*的瞰如累没有空5JTW,,胃H晶的步H改为水.M后切片80可MH:四川胸牌一条,荷兰豆220g,大|«,切片,大慧一小WL切开MW,均S少注99.1、荷兰豆125.216.246.121:2222一生e*查找菜谙获取菜谱收底菜谱提示信.H介:讨于我们这冷大学生寝室,是没有泊VI三JU炒菜的,只能做些箫的米熏R.N身体也».«N:生荣,。,魅独,陈.iW,食用温,91.娘水,麦己Ii洗蜉的生柒.2、拿一碗,放人锋末、海帽.几滴防Ir番油、用斛油.调匀.3、得便好的生菜放入谓“备H的碗中,授,均匀的用4)购物清单界面5)菜谱界面16)菜谱界面2八、总结与体会通过这次的课程设计,使我们了解了更多数据库原理与应用这门课程,对以前不太理解和熟悉的内容有更多的掌握,特别是如何将数据库放在服务器端并通过网络通信实现与应用程序的互连。有了上个学期数据库作业的经验,这次课程设计中数据库的建立和查询语句就不是难点了。画出E-R图,建表,插入一些测试数据,很快就完成了。但是,本次课设,最具有挑战性的工作其实是:Android界面的实现,数据库的调用和数据的远程传输。在设计布局的时候我们发现布局文件并没有预期中的容易控制,安卓布置的时候跟其他开发软件不同,不能随意拖动空间到想要的地方。而服务器与数据库的连接更是一大难题,服务端与客户端的连接更是要获取很多权限才能实在地操作,服务端跟客户端之间的数据传输有许许多多的格式问题需要修正。经过这次课程设计,我们可以更好的将所学知识运用到实际中去,使得所学的知识能够融会贯通。同时,在课程设计过程中,我们还自学了许多其他知识,扩展了视野,锻炼了专业能力,激发了对其他领域的兴趣。我们今后一定更加努力的学习,以实践检验自己所习得的知识,让自己更加充实。

    注意事项

    本文(数据库课程设计报告--美食主题-安卓系统菜谱查询应用程序.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开