1、宁宁波大红鹰学院 Android 开 发 基 础 项 目 名 称 基 于 Android 的 图 书 管 理 应 用 的设 计 与 实 现所 在 学 院 信 息 工 程 学 院班 级 13 软工 1 班姓 名 许 格学 号 13221201412016 年 6 月 20 日目录一、开发背景 1二、需求分析 12.1 功能分析 12.2 开发技术分析 1三、系统设计 13.1 系统目标 .13.2 系统功能 .23.3 数据库设计 .2四、系统功能实现 44.1 主界面 .44.2.客户端登录 64.2.1 学生登录 .64.2.2 学号快捷注册 .74.3 图书管理 94.3.1 图书添加 9
2、4.3.2 图书信息显示 .104.3.3 图书数据库操作 .114.4 投稿阅读 124.4.1 投稿 .124.4.2 阅读广场 134.4.3 投稿数据库操作 144.5 预约图书 154.5.1 预约卡 154.5.2 预约数据库 154.6 翻译 164.7 娱乐 17五、 总结与收获 180一、开发背景移动互联网时代的来临,说明一个崭新的时代开始了。所谓移动互联网是将移动通信和互联网整合在一起,移动设备(包括手机和上网本)可以随时随地地访问互联网资源和应用。 智能手机是移动互联网时代一个标志性的客户端工具,它和传统的手机是有区别的,它就像一台“小电脑”,具有独立的操作系统,可以自由
3、安装、卸载软件,具有强大的计算和存储能力,可以通过移动通信网络来实现无线网络接入。 对于移动终端设备飞速发展的今天,传统 WEB 上的应用出现在手机终端是一个大的趋势。而基于Android 开发的图书馆管理系统手机客户端,正是对这一趋势的良好体现,Android 平台下的图书馆管理系统的开发,能很好的为用户提供方便,用户能通过它能随时随地的了解系统的实时信息,做到信息的实时化。通过 Android 平台下的图书馆管理系统客户端的开发,与传统 WEB 应用进行良好的互补。 同时,对于校内的图书馆管理系统来说,手机对于学生是必不可少的一个物品,手机客户端这种形式的图书馆管理系统,能更加贴近学生的生
4、活习惯,并且适合学生年龄段的习性,这对学生更多的接触到图书馆的信息有一定得促进作用。 二、需求分析2.1 功能分析基于 Android 平台开发的图书馆管理系统客户端从设计者的角度来看,用户角色主要为学生用户;功能包括注册、登录、投稿、翻译、娱乐、书籍查询、图书实时更新,借阅图书共八大部分。学生用户可以根据学号进行快捷注册,学生在投稿区写文章发表,在广场互动,翻译功能可以帮助解决学习上遇到不理解的英文进行翻译,娱乐功能中有两个小游戏,用户可以适时放松一下。当然主要功能当然是查询借阅书籍。2.2 开发技术分析该系统是基于 Eclipse 软件并连接 Android SDK 进行开发的基于 And
5、roid 平台开发的图书管理系统,数据库采用较小速度快的 SQLite,是嵌入式移动设备中常用的轻量级数据库。软件 UI 通常使用 xml 技术设计,由于布局的使用,并且布局之间可以互相嵌套,使得 android 软件 UI 的设计变得非常灵活,力求图书馆与学生之间更加亲近方便。 三、系统设计3.1 系统目标 系统采用人机交互的方式,界面美观友好,信息查询灵活、方便,数据存储安全可靠; 能够让学生更好更方便的了解图书馆和借阅图书; 丰富学生知识,增加学生阅读积极性; 能够对学生信息进行有效的管理; 能够准确、详细地了解学生的每月阅读量; 系统应最大限度地实现易维护性和易操作性。13.2 系统功
6、能本系统的具体功能如下:1、 图书管理:新增、浏览馆藏图书。2、 借阅图书:学生查找图书进行预约,预约成功可前往图书馆借阅。3、 投稿:学生可以在平台发布文章,发布的文章可在阅读界面查看,可对文章点赞,评论和分享。4、 翻译:学生可以使用翻译功能在线翻译,如学习时遇到看不懂的英文句子以及单词。5、 娱乐:娱乐功能开发了两个休闲小游戏,打地鼠游戏和扫雷游戏。学生可在学习之余放松一下。6、 个人:学生可使用学号进行注册和登录。本系统的系统结构功能图如图 3-1 所示。基 于 A n d r o i d 的 图 书 管 理 应 用 的 设 计 与 实 现图书管理 预约图书投稿更新图书 馆藏图书预约卡
7、发布文章 查看文章 翻译外文 扫雷游戏注册打地鼠游戏登录翻译 娱乐 个人图 3-1 系统结构功能图3.3 系统用例图乐 乐乐 乐 乐 乐 乐 乐 乐乐 乐 乐 乐乐 乐乐 乐incouldincould乐 乐 乐 乐乐 乐 乐 乐乐 乐 乐 乐 乐 乐 乐 乐乐 乐乐 乐乐 乐乐 乐23.4 数据库设计由于本系统是在校学生使用的软件,需要充分考虑图书管理和学生借阅需求等问题,而SQLite 是一款轻型的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百 K 的内存就够了。处理速度快,效率高,正好满足了手机 app 的需求,所以本系统采用 SQLite 数据库。根据数据库的概念设计,可以
8、进一步进行数据库的逻辑设计。本人所设计的数据库命名为 Tushu,数据库中包括以下的数据表:1、学生信息表(student) 2、借阅表(cord) 3、图书表(books) 4、留言表(reads)(一)学生信息表(student)表 1 student 表结构字段名 数据类型 说明Id Int 主键S_Num Varchar(10) 学号S_Name Varchar(20) 姓名S_Class Varchar(20) 班级S_Phone Varchar(11) 联系方式S_pwd Varchar(20) 密码(二)借阅表(cord)表 2 cord 表结构字段名 数据类型 说明ISBN I
9、nt 图书编号,主键B_Name Varchar(20) 书名S_Num Varchar(20) 学号ReturnTime Datetime 归还时间(三)图书表(books)表 3 books 表结构字段名 数据类型 说明ISBN Int 图书编号,主键B_Name Varchar(20) 书名B_Author Varchar(20) 作者3B_Pm Varchar(255) 书本介绍(四)留言表(reads)表 4 reads 表结构字段名 数据类型 说明Number Int 留言编号,主键Title Varchar(50) 标题Article Varchar(255) 内容四、系统功能实
10、现4.1 主界面该系统分为三大功能模块:图书管理、预约图书、翻译、投稿、娱乐、登录注册六个功能,下面分别介绍这七大块,界面如图 4-1 所示。图 4-1 会员管理界面图Activity 关键代码实现如下:/主界面 GridView 六个菜单适配,新建适配器 MuneAdapter.Java:public class MuneAdapter extends BaseAdapterint imageId =R.drawable.j,R.drawable.h,R.drawable.o,R.drawable.p,R.drawable.k,R.drawable.i;4String text=“书架“,“
11、阅读“,“签到“,“投稿“,“翻译“,“娱乐“;private Context context;public MuneAdapter(Context context)this.context=context;public int getCount() return 6;public Object getItem(int position) return null;public long getItemId(int position) return 0;public View getView(int position, View convertView, ViewGroup parent) Vi
12、ew view =View.inflate(context, R.layout.item_mune, null);ImageView icon=(ImageView) view.findViewById(R.id.iv);TextView tv=(TextView)view.findViewById(R.id.tv);icon.setImageResource(imageIdposition);tv.setText(textposition); return view; /在主界面进行适配,然后进行跳转。gView.setAdapter(new MuneAdapter(MainActivity
13、.this);gView.setOnItemClickListener(new OnItemClickListener() public void onItemClick(AdapterView parent, View view, int position,long id) switch (position) case 0: startActivity(BookActivity.class);break;4.2.客户端登录4.2.1 学生登录学生登录客户端主要用于查询想借阅的图书和借书。登录界面如图 4-2-1 所示,学生可以登录注册进入客户端。在登录界面中,首先提醒您输入登录信息,并且把登
14、录的用户名和密码输入其文本框内。5图 4-2-1 登录界面图技术分析:创建了一个名为 LoginActivity.java 实现登录,查询数据库中的学号和密码是否匹配,如果没有账号点击注册跳转到注册页面。代码实现如下:String name=user.getText().toString();String pass=pwd.getText().toString();Log.i(“TAG“,name+“_“+pass);StudentDao dao=new StudentDao(this);boolean flag=dao.login(name, pass);if (TextUtils.isEm
15、pty(name)|TextUtils.isEmpty(pass) Toast.makeText(this, “学号和密码不能为空!“, 0).show();else if(flag)Log.i(“TAG“,“登录成功!“);Toast.makeText(LoginActivity.this, “登录成功“, Toast.LENGTH_LONG).show();Intent intent =new Intent();intent.setClass(LoginActivity.this, MeActivity.class);intent.putExtra(“name“, user.getText
16、().toString();startActivity(intent);elseLog.i(“TAG“,“登录失败!“);Toast.makeText(LoginActivity.this, “登录失败!学号或密码不正确!“, Toast.LENGTH_LONG).show(); 4.2.2 学号快捷注册学生登录客户端没有账号可点击登录按钮右下方的“学号快捷注册”进行注册。注册界面如图 4-2-2 所示,学生可以注册个人信息然后进行登录。在注册界面中,首先提醒您输入个人信息,注册成功后跳转到登录界面。6图 4-2-2 注册界面代码实现如下:String S_Num=S_num.getText(
17、).toString().trim();String S_Name=S_name.getText().toString().trim();String S_Class=S_class.getText().toString().trim();String S_Phone=S_phone.getText().toString().trim();String S_pwd=S_Pwd.getText().toString().trim();if (TextUtils.isEmpty(S_Num)|TextUtils.isEmpty(S_pwd) Toast.makeText(this, “学号和密码不
18、能为空!“, 0).show();return;else Student student =new Student();student.S_Num=S_Num; student.S_Name=S_Name;student.S_Class=S_Class; student.S_Phone=S_Phone;student.S_pwd=S_pwd; dao.add(student);Toast.makeText(ZhuceActivity.this,“注册成功!“, 0).show();finish();break; 4.2.3 个人信息数据库/ Studentdao.java public cla
19、ss StudentDaoprivate DBOpenHelper helper;private SQLiteDatabase db;public StudentDao(Context context)super(); helper=new DBOpenHelper(context);public boolean add(Student student)db=helper.getWritableDatabase();ContentValues values =new ContentValues();values.put(“S_Num“,student.S_Num);values.put(“S_
20、Name“, student.S_Name);values.put(“S_Class“, student.S_Class);values.put(“S_Phone“, student.S_Phone);values.put(“S_pwd“, student.S_pwd);long rowid=db.insert(“student“, null, values);if (rowid=-1) return false;else return true; public boolean login(String S_Num,String S_pwd)db=helper.getReadableDatab
21、ase();String sql=“select * from student where S_Num=? and S_pwd=?“;Cursor cursor=db.rawQuery(sql, new StringS_Num,S_pwd);if(cursor.moveToFirst()=true) cursor.close(); return true; return false;4.3 图书管理74.3.1 图书添加图书管理员可以进行图书的添加删除和修改。及时的更新书库图书信息和增加新书,点击下方茶杯按钮即可添加图书,图书添加界面如图 4-3-1 所示。图 4-3-1 添加图书界面图技术分
22、析:在 SQLite 中添加 books 表,进行增删查改。创建了一个名为AddbookActivity.java 实现添加图书信息。代码实现如下:/ AddbookActivity.java 添加图书:String B_Name=bookname.getText().toString().trim();String B_Author=author.getText().toString().trim();String B_pm=pm.getText().toString().trim();if (TextUtils.isEmpty(B_Name)|TextUtils.isEmpty( B_Au
23、thor) Toast.makeText(this, “书名不能为空!“, 0).show();return;else Book book =new Book(); book.B_Name=B_Name;book.B_Author=B_Author; book.B_Pm=B_pm;dao.add(book); Toast.makeText(AddbookActivity.this,“添加成功!“,0).show();finish(); break;84.3.2 图书信息显示BookActivity.java 显示数据库中所有图书信息,用 listview 显示,创建一个BookActivity
24、.Java 实现 listview 的适配。如图 4-3-2 图书信息界面图。图 4-3-2 图书信息界面图技术分析:通过 BookActivity.Java 实现 listview 的适配。代码实现如下:/BookAdapter.java 适配器把数据库的图书信息显示在 listview 上,关键代码如下:public View getView(final int position, View convertView, ViewGroup parent) ViewHolder holder= null;if (convertView=null) convertView=View.inflat
25、e(context, R.layout.item_book, null);holder=new ViewHolder();holder.bookname=(TextView) convertView.findViewById(R.id.bookname);holder.author=(TextView) convertView.findViewById(R.id.author);holder.bookpm=(TextView) convertView.findViewById(R.id.pm);convertView.setTag(holder);else holder=(ViewHolder
26、) convertView.getTag();holder.bookname.setText(books.get(position).B_Name);holder.author.setText(books.get(position).B_Author);9holder.bookpm.setText(books.get(position).B_Pm);return convertView;static class ViewHolderTextView bookname; TextView author; TextView bookpm; TextView record;View shu; /Bo
27、okActivity.java 使用 listview 显示所有图书信息。mListView.setOnScrollListener(new OnScrollListener() public void onScrollStateChanged(AbsListView view, int scrollState) switch (scrollState) case OnScrollListener.SCROLL_STATE_IDLE:int lastVisiblePosition=mListView.getLastVisiblePosition();if (lastVisiblePositio
28、n=pagebook.size()-1) pagenumber+;if (pagenumber*pagesize=totalNumber) Toast.makeText(BookActivity.this,“没有更多的数据了“, 0).show();else pagebook.addAll(dao.getPageBook(pagenumber, pagesize);adapter.notifyDataSetChanged();break;public void onScroll(AbsListView view, int firstVisibleItem, int VisibleItemCou
29、nt, int totalItemCount) );4.3.3 图书数据库操作public class BookDao private DBOpenHelper helper;private SQLiteDatabase db;public BookDao(Context context) super();helper=new DBOpenHelper(context); public boolean add(Book book) db=helper.getWritableDatabase();ContentValues values =new ContentValues();values.p
30、ut(“B_Name“, book.B_Name); values.put(“B_Author“, book.B_Author);values.put(“B_Pm“, book.B_Pm); long rowid=db.insert(“books“, null, values);if (rowid=-1) return false; else return true; public boolean delete(Book book) db=helper.getWritableDatabase();int rowname=db.delete(“books“,“B_Name=?“ , new St
31、ring book.B_Name );if (rowname=0) return false; else return true; 4.4 投稿阅读4.4.1 投稿每个学生都可以投稿写文章然后发布,发布出去的文章可以在阅读界面查看。阅读界面相当于广场,用户可以在广场上看到文章。投稿界面如图 4-4-1 所示:10图 4-4-1 投稿界面图技术分析:输入标题和文章内容发布,用户可以在阅读“广场”上看到发布的内容。代码实现如下:/Tougao.java 关键代码String Title=title.getText().toString().trim();String Article=article
32、.getText().toString().trim();if (TextUtils.isEmpty(Title) Toast.makeText(this, “标题不能为空!“, 0).show();return; else Write write =new Write();write.Title=Title; write.Article=Article;dao.add(write); Toast.makeText(TougaoActivity.this,“发布成功!“,0).show();break;4.4.2 阅读广场用户可以在阅读广场查看发布的文章,可以评论、点赞和分享。11图 4-4-
33、2 阅读界面图技术分析:使用 listview 来显示发布的文章,创建一个 ReadAdapter.java 适配器。代码实现如下:/创建一个 ReadAdapter.java 实现一个适配器功能显示到 listview 上,显示广场上所有文章。关键代码如下:public View getView(int position, View convertView, ViewGroup parent) ViewHolder holder= null;if (convertView=null) convertView=View.inflate(context, R.layout.activity_re
34、adadapter, null);holder=new ViewHolder();holder.title=(TextView) convertView.findViewById(R.id.read_title);holder.article=(TextView)convertView.findViewById(R.id.read_article);convertView.setTag(holder);else holder=(ViewHolder) convertView.getTag(); holder.title.setText(writes.get(position).Title);h
35、older.article.setText(writes.get(position).Article);return convertView; static class ViewHolderTextView title;TextView article;/ReadAdapter.java 关键代码:12public void onScrollStateChanged(AbsListView view, int scrollState) switch (scrollState) case OnScrollListener.SCROLL_STATE_IDLE:int lastVisiblePosi
36、tion=mListView.getLastVisiblePosition();if (lastVisiblePosition=pagewrite.size()-1) pagenumber+;if (pagenumber*pagesize=totalNumber) Toast.makeText(ReadActivity.this,“没有更多的数据了“, 0).show();else pagewrite.addAll(dao.getPagewrite(pagenumber, pagesize);adapter.notifyDataSetChanged();break; public void o
37、nScroll(AbsListView view, int firstVisibleItem, int VisibleItemCount, int totalItemCount) );4.4.3 投稿数据库操作public class RecordDao private DBOpenHelper helper;private SQLiteDatabase db;public RecordDao(Context context) super(); helper=new DBOpenHelper(context); public boolean add(Record record) db=help
38、er.getWritableDatabase();ContentValues values =new ContentValues();values.put(“B_Name“, record.B_Name); values.put(“S_Num“, record.S_Num);values.put(“ReturnTime“, record.ReturnTime);long rowid=db.insert(“cord“, null, values);if (rowid=-1) return false; else return true; public boolean delete(Record
39、record) db=helper.getWritableDatabase();int rowname=db.delete(“cord“,“S_Num=?“ , new String record.S_Num );if (rowname=0) return false; else return false; 4.5 预约图书4.5.1 预约卡学生可以在借书功能界面进行图书预约,输入图书名和学号还有归还时间。界面图如 4-5 所示。13图 4-5-1 预约图书界面图代码实现如下:/JieyueActivity.java 关键代码:String B_Name=booknam.getText().t
40、oString().trim();String s_Num=snum.getText().toString().trim();String time=returntime.getText().toString().trim();if (TextUtils.isEmpty(B_Name) Toast.makeText(this, “书名不能为空!“, 0).show();return; else Record record=new Record(); record.B_Name=B_Name;record.S_Num=s_Num; record.ReturnTime=time;dao.add(r
41、ecord); Toast.makeText(JieyueActivity.this,“预约成功!“, 0).show();finish(); break; 4.5.2 预约数据库/预约数据库实现,关键代码实现如下:public class RecordDao private DBOpenHelper helper;private SQLiteDatabase db;public RecordDao(Context context) super();helper=new DBOpenHelper(context); public boolean add(Record record)db=hel
42、per.getWritableDatabase();ContentValues values =new ContentValues();values.put(“B_Name“, record.B_Name); values.put(“S_Num“, record.S_Num);values.put(“ReturnTime“, record.ReturnTime);14long rowid=db.insert(“cord“, null, values);if (rowid=-1) return false; else return true; public boolean delete(Reco
43、rd record)db=helper.getWritableDatabase();int rowname=db.delete(“cord“,“S_Num=?“ , new String record.S_Num );if (rowname=0) return false; else return false; 4.6 翻译图书馆应用具有翻译功能这是一个创新,可以使学习英语的学生可以方便的当做英文字典。图 4-6 翻译界面图技术分析:翻译功能使用 http 实现网页在线翻译,在 webview 中放一个有道的 API 网页。代码实现如下:/FanyiActivity.java 关键代码:myW
44、ebView1 = (WebView) findViewById(R.id.myWebView1);myWebView1.setWebViewClient(new WebViewClient()public boolean shouldOverrideUrlLoading(WebView view,String url)view.loadUrl(url);return super.shouldOverrideUrlLoading(view, url); );myWebView1.loadUrl(“http:/ 娱乐娱乐功能里有两个休闲小游戏,打地鼠和扫雷游戏。可提供用户休息时娱乐。点击打地鼠游
45、戏,在屏幕上会随机显示地鼠,触摸地鼠后,该地鼠将不显示,同时屏幕上会显示打到了几只地鼠,打地鼠游戏界面如下图 4-7 所示:4-7 娱乐界面技术分析:地鼠随机的出现通过生成地鼠的随机位置,并使用线程控制出现时间间隔,确定地鼠是否打中则借助触摸监听器 onTouch()方法实现。代码实现如下:/DadishuActivity.java 关键代码:private int i=0;private ImageView mouse,exit;private Handler handler;public float position =new float31,625,424,349,300,520, 22
46、1, 256 , 100, 296 , 150, 220 , 367, 292 , 333, 600 ;/地鼠位置数组mouse.setOnTouchListener(new OnTouchListener() public boolean onTouch(View view, MotionEvent event) view.setVisibility(view.INVISIBLE); i+;Toast.makeText(DadishuActivity.this, “打到“+i+“只地鼠“,0).show(); return false; ); handler=new Handler()pub
47、lic void handleMessage(Message msg) int index=0; if(msg.what=0x101)index=msg.arg1; mouse.setX(positionindex0);16mouse.setY(positionindex1); mouse.setVisibility(View.VISIBLE); super.handleMessage(msg); ;Thread t=new Thread(new Runnable()public void run() int index =0;while(!Thread.currentThread().isI
48、nterrupted()index=new Random().nextInt(position.length);Message m=handler.obtainMessage();m.arg1=index; m.what=0x101; handler.sendMessage(m);try Thread.sleep(new Random().nextInt(500)+500);catch(InterruptedException e)e.printStackTrace(); ); t.start(); 5、总结与收获这个学期从来学就开始自学安卓开发,每天平均花 9 个小时,从一开始的 0 基础,不断的一点点写基础代码,实现基础功能。甚至一开始的时候在基础代码,没有几行的情况下都会有许多错误,询问老师和同学,帮助解决 bug。图书管理系统是我集合诸多之前自学时写的功能,该系统主要实现了管理图书,预约图书,翻译功能,娱乐功能,用户登录注册和投稿功能。 由于自身经验不足,尽管按照书本实现代码,但还是有各种各样的问题。例如在创建数据库的时候,在没有错误情况下,完全重新写了三次都无法运行。代码出现错误不知如何修改,陷入无尽的迷茫中,因