《移动应用技术》
课程设计报告
题 目: 基于Android的金源书店库存 管理系统的开发与设计
学生姓名:
专 业: 信息管理与信息系统
班 级:
指导教师:
信息管理与工程系
20##年 5 月 28 日
基于Android的金源书店库存管理系统的开发与设计
摘要:
金源书店库存管理系统是典型的信息管理系统(MIS Management Information System),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的数据库。而对于后者则要求应用程序功能完备,易使用等特点。
经过分析,本小组决定采用 SQLite 建立数据库后台,使用Eclipse开发工具,利用其提供的各种面向对象的开发工具进行开发。本系统通过基本信息管理对供应商、顾客和商品进行基本信息的管理。通过库存管理进行商品的入库出库操作来完成商品信息的管理。
经过本小组近一个月的刻苦学习与实践,如期完成了系统的开发工作,实现了金源书店库存管理系统一些基本功能。
窗体底端
关键字:信息管理系统,数据库,出库,入库
目 录
1 项目简介与分工. 1
1.1 项目简介. 1
1.2 项目分工. 2
2 项目设计方案. 3
3 用到的技术. 5
3.1用户登录模块. 5
3.2基本信息管理. 11
3.3 库存信息管理. 26
3.4 系统设置. 38
3.5 关于. 42
3.6相关技术. 42
4项目总结及展望. 44
5心得体会. 45
参 考 文 献. 47
1 项目简介与分工
1.1 项目简介
金源书店库存管理是通过采购、仓储、综合、出库、配送等活动,解决物资供需之间存在的时间、空间、数量、品种价格等方面的矛盾,以此衔接社会生产的各环节,从而确保生产的顺利进行。
传统仓库管理完全由人来完成,以手工记录为主,当企业的物流业务成长到一定规模之后,随着订单数量的增加,客户需求不断个性化,执行效率就成为物流发展的瓶颈,单纯依靠人力资源的增加已不能提升出入库执行的速度,反而带来成本的大幅度上升与差错频频。因此,本系统以提高仓库管理人员的工作效率,降低其工作量、减少手工操作的差错率、提高库存的准确率为初衷,针对金院地下超市仓库的管理模式,提出此项目的制作,且利用计算机技术与现代的管理技术相互配合,来更加准确、高速地完成工业企业日常的仓库管理工作。使企业能够以最少的人员来完成更多的工作。为此实现了本系统的完成。
本小组采用 SQLite 建立数据库后台,使用Eclipse开发工具,利用其提供的各种面向对象的开发工具进行开发。本系统通过基本信息管理对供应商、顾客和商品进行基本信息的管理。通过库存管理进行商品的入库出库操作来完成商品信息的管理。
1.2 项目分工
本项目分工情况如表1-1所示:
表1-1 项目分工表
2 项目设计方案
图2-1系统功能模块图
图2-1系统功能模块图列出了系统的主要功能模块。包括基本信息管理,库存信息管理以及系统设置。其中基本信息管理又包括供应商信息管理,顾客信息管理以及商品信息管理。库存信息管理包括入库管理和出库管理。系统设置包括登录注册、修改密码和退出三个功能。其中供应商信息管理包括添加供应商信息、修改供应商信息、删除供应商信息、查询供应商信息四个子功能。顾客信息管理包括添加顾客信息、修改顾客信息、删除顾客信息、查询顾客信息四个子功能。商品信息管理包括添加商品信息、修改商品信息、删除商品信息、查询商品信息四个子功能。入库管理包括添加入库商品信息、修改入库商品信息、删除入库商品信息、查询入库商品信息四个子功能。出库管理包括添加出库商品信息、修改出库商品信息、删除出库商品信息、查询出库商品信息四个子3功能。
总体框架如图2-2所示:
图2-2总体框架图
3 用到的技术
3.1用户登录模块
用户登录模块是系统模块中一个重要的子系统模块,它是系统安全的一个保障。它的主要功能是安全帐号管理,需要正确帐号和密码才能进入系统。对于错误帐号和密码给出提示。
图3-1 登录界面
处理流程:
输入:用户名和密码。
处理:
(1)用户登录窗体启动。
(2)用户填写用户名并输入密码。
(3)从操作人员表中检查是否有相应的用户名和密码。
(4)如果用户名或密码错误,进行提示。
(5)如果输入的用户名和相应密码正确,则根据该用户的权限类别进行权限设置。
(6)进入主控制平台。
设计流程图,如图3-2所示:
图3-2 登录流程图
相关代码如下:
public class StoreManagementActivity extends Activity {
private EditText use;// 用户名
private EditText password;// 密码
SqlHelpdemo db;
SQLiteDatabase sDatabase = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
use = (EditText) findViewById(R.id.edi1);
password = (EditText) findViewById(R.id.edi2);
db = new SqlHelpdemo(getApplicationContext(), "store.db", null, 1);
sDatabase = db.getWritableDatabase();
}
// 登录按钮监听
public void onload(View v)
{
// 定义取数据的字符串
String userName = "";
String userPw = "";
String i = use.getText().toString();
// 编写数据库语句
String select_sql = "select username,password from user_info where username = '"+ i + "'";
// 执行语句
Cursor cursor = sDatabase.rawQuery(select_sql, null);
cursor.moveToFirst();
// 将从数据中取出的用户名和密码赋值给两个字符串变量
try
{
userName = cursor.getString(0);
userPw = cursor.getString(1);
} catch (Exception e)
{
// TODO: handle exception
userName = "";
userPw = "";
}
// 判断用户名是否为空
if (use.getText().toString().equals(""))
{
DialogDemo.builder(StoreManagementActivity.this, "错误信息",
"用户名不能为空!");
}
// 判断密码是否为空
else if (password.getText().toString().equals(""))
{
DialogDemo.builder(StoreManagementActivity.this, "错误信息",
"密码不能为空!");
}
// 判断用户名和密码是否正确
else if (!(use.getText().toString().equals(userName) && password
.getText().toString().equals(userPw)))
{
DialogDemo.builder(StoreManagementActivity.this, "错误信息",
"用户名或密码错误,请重新输入");
}
// 全部正确跳转到操作界面
else
{
cursor.close();
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("username",userName);
intent.putExtras(bundle);
intent.setClass(getApplicationContext(), MenuDemo.class);
startActivity(intent);
}
}
注册界面如图3-3所示:
图3-3 注册界面
相关代码如下:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.userregister);
name = (EditText) findViewById(R.id.usename);
pass = (EditText) findViewById(R.id.password);
passsure = (EditText) findViewById(R.id.passwordsure);
workid = (EditText) findViewById(R.id.useide);
db = new SqlHelpdemo(getApplicationContext(), "store.db", null, 1);
sDatabase = db.getWritableDatabase();
}
public void sure(View v) {
db = new SqlHelpdemo(getApplicationContext(), "store.db", null, 1);
sDatabase = db.getWritableDatabase();
if (name.getText().toString().equals("")
|| pass.getText().toString().equals("")
|| passsure.getText().toString().equals("")
|| workid.getText().toString().equals("")) {
DialogDemo.builder(UserRegister.this, "错误信息", "请填写完整信息!");
} else if (!pass.getText().toString()
.equals(passsure.getText().toString())) {
DialogDemo.builder(UserRegister.this, "错误信息", "两次密码输入不一致!");
} else {
String ename = name.getText().toString();
String epass = pass.getText().toString();
String eid = workid.getText().toString();
// 查询语句
String selectStr = "select username from user_info";
Cursor select_cursor = sDatabase.rawQuery(selectStr, null);
select_cursor.moveToFirst();
String string = null;
do {
try {
string = select_cursor.getString(0);
} catch (Exception e) {
// TODO: handle exception
string = "";
}
if (string.equals(ename)) {
DialogDemo.builder(UserRegister.this, "错误信息",
"用户名已存在,请另设用户名");
select_cursor.close();
break;
}
} while (select_cursor.moveToNext());
// 没有重名注册开始
if (!string.equals(ename)) {
// 定义ID
int id = 0;
String select = "select max(_id) from user_info";
Cursor seCursor = sDatabase.rawQuery(select, null);
try {
seCursor.moveToFirst();
id = Integer.parseInt(seCursor.getString(0));
id += 1;
} catch (Exception e) {
// TODO: handle exception
id = 0;
}
sDatabase.execSQL("insert into user_info values('" + id + "','"+ ename + "','" + epass + "','" + eid + "')");
DialogDemo.builder(UserRegister.this, "提示", "注册成功,请返回登录界面登录");
seCursor.close();
}
}
3.2基本信息管理
基本信息管理包括供应商信息管理、客户信息管理和商品信息管理:
供应商是商品在入库时提供商品的人,在进行入库操作时必须先添加该商品的供应商的信息。供应商的信息包括供应商的公司名称,联系人姓名,联系人地址,城市名称,地区名称,邮政编码,联系电话,传真号码,公司主页等基本信息。这些都是必须要求输入的。本程序提供了增加,删除,修改和查询供应商信息的功能。增加:当有新的供应商提供商品的时候需要使用此功能。删除:当与某供应商取消贸易关系时,需要把供应商信息从系统中删除。修改:当某供应商基本信息发生改变时,可以修改供应商信息。查询:可以查询库中任何供应商的信息。因此仓库管理员可以方便的进行供应商信息的管理。添加供应商信息的对话框如图3-4所示:
图3-4 添加供应商信息
添加供应商信息操作步骤及处理流程:
(1)选择基本信息管理->供应商信息管理->添加供应商信息
(2)出现图3-4所示对话框
(3)用户输入公司名称,联系人姓名,联系人地址,城市名称,地区名称,邮政编码,联系电话,传真号码,公司主页
(4)点击保存.如果其中有空项,会提示该项不能为空.要求用户重新输入
(5)弹出提示框显示供应商信息已经加入。
(6)用户可以继续加入供应商信息或者点返回进行其它操作。
设计流程图,如图3-5所示:
图3-5 添加供应商流程图
相关代码如下:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tianjiag);
setTitle("添加供应商信息");
Intent inte = getIntent();
Bundle name = inte.getExtras();
names = inte.getStringExtra("username");
db = new SqlHelpdemo(getApplicationContext(), "store.db", null, 1);
sDatabase = db.getWritableDatabase();
gsmc=(EditText) findViewById(R.id.gsmce);
lxr=(EditText) findViewById(R.id.lxre);
csmc=(EditText) findViewById(R.id.csmce);
lxdz=(EditText) findViewById(R.id.lxdze);
dqmc=(EditText) findViewById(R.id.dqmce);
yzbm=(EditText) findViewById(R.id.yzbme);
lxdh=(EditText) findViewById(R.id.lxdhe);
czhm=(EditText) findViewById(R.id.czhme);
gszy=(EditText) findViewById(R.id.gszye);
}
public void save1(View v){
if(gsmc.getText().toString().equals("")){
DialogDemo.builder(Tianjiag.this, "提示", "请输入公司名称");
}
else{
// 查询语句
String egsmc=gsmc.getText().toString();
String elxr=lxr.getText().toString();
String elxdz=lxdz.getText().toString();
String ecsmc=csmc.getText().toString();
String edqmc=dqmc.getText().toString();
String eyzbm=yzbm.getText().toString();
String elxdh=lxdh.getText().toString();
String eczhm=czhm.getText().toString();
String egszy=gszy.getText().toString();
String selectStr = "select comname from gongys";
Cursor cursor = sDatabase.rawQuery(selectStr, null);
cursor.moveToFirst();
String nameg = null;
do {
try {
nameg = cursor.getString(0); } catch (Exception e) {
// TODO: handle exception
nameg = "";
}
if (nameg.equals(egsmc)) {
DialogDemo.builder(Tianjiag.this, "错误信息","该公司信息已存在");
cursor.close();
break;
}
} while (cursor.moveToNext());
if (!nameg.equals(egsmc)) {
// 定义ID
int id = 0;
String select = "select max(_id) from gongys";
Cursor seCursor = sDatabase.rawQuery(select, null);
try {
seCursor.moveToFirst();
id = Integer.parseInt(seCursor.getString(0));
id += 1;
} catch (Exception e) {
// TODO: handle exception
id = 0;
}
sDatabase.execSQL("insert into gongys values('" + id + "','"+ egsmc + "','" + elxr + "','" +elxdz+ "','"+ecsmc+ "','"+ edqmc+ "','"+eyzbm+ "','"+ elxdh+ "','"+eczhm+ "','"+egszy+ "')");
Toast.makeText(Tianjiag.this, "添加成功", Toast.LENGTH_LONG).show();
seCursor.close();
}
}
}
修改供应商信息步骤及处理流程:
(1) 选择要修改的供应商信息
(2) 选择基本信息管理->供应商信息管理->修改供应商信息
(3) 用户可以修改供应商的基本信息,修改完后点保存
(4) 如果其中有空项或非法字符,会提示该项不能为空或输入不合要求.要求用户重新输入
(5) 更新供应商信息列表。显示信息已经修改
(6) 用户可以继续加入供应商信息或者点返回进行其它操作
设计流程图,如图3-6所示:
图3-6 修改供应商信息流程图
相关代码如下:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.shanchuk1);
setTitle("修改供应商");
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
db = new SqlHelpdemo(getApplicationContext(), "store.db", null, 1);
sDatabase = db.getWritableDatabase();
listview = (ListView) findViewById(R.id.kehulist);
List> slist = new ArrayList>();
String selectStr = "select _id,comname,pername,addr,city,diqu,youbian,tel,chuangzhen,web from gongys";
Cursor cursor = sDatabase.rawQuery(selectStr, null);
cursor.moveToFirst();
int count = cursor.getCount();
id = new String[count];
cname = new String[count];
pname= new String[count];
add= new String[count];
city= new String[count];
diqu = new String[count];
youbian= new String[count];
tel= new String[count];
chuanzhen= new String[count];
web = new String[count];
do {
try {
id[i] = cursor.getString(0);
cname[i] = cursor.getString(1);
pname[i] = cursor.getString(2);
add[i] = cursor.getString(3);
city[i] = cursor.getString(4);
diqu[i] = cursor.getString(5);
youbian[i] = cursor.getString(6);
tel[i] = cursor.getString(7);
chuanzhen[i] = cursor.getString(8);
web[i] = cursor.getString(9);
i++;
} catch (Exception e) {
// TODO: handle exception
}
} while (cursor.moveToNext());
for (int i = 0; i < id.length; i++) {
Map map = new HashMap();
map.put("id", id[i]);
map.put("cname", cname[i]);
map.put("pname", pname[i]);
map.put("add", add[i]);
map.put("city", city[i]);
map.put("diqu", diqu[i]);
map.put("youbian", youbian[i]);
map.put("tel", tel[i]);
map.put("chuanzhen", chuanzhen[i]);
map.put("web", web[i]);
slist.add(map);
}
SimpleAdapter simple = new SimpleAdapter(this, slist,
R.layout.shanchukadpter, new String[] { "id", "cname", "pname",
"add" ,"city","diqu","youbian","tel","chuanzhen","web"}, new int[] { R.id.t1, R.id.t2,R.id.t3,R.id.t4,R.id.t5,R.id.t6,R.id.t7,R.id.t8,R.id.t9,R.id.t10,};
listview.setAdapter(simple);
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
for(int i=0;i
if(arg2==i){
builder.setTitle("确认消息");
builder.setMessage("确定要修改该供应商吗?");
final int j=i;
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent=new Intent();
Bundle bundle = new Bundle();
bundle.putString("compname",cname[j]);
intent.putExtras(bundle);
intent.setClass(Xiugaig.this, Xiugaig1.class);
startActivity(intent);
finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub }
});
builder.create().show();
});
}
删除供应商信息步骤及处理流程
(1) 选择要修改的供应商信息
(2) 选择基本信息管理->供应商信息管理->删除供应商信息
(3) 更新供应商信息列表。显示信息已经被删除
(4) 信息一旦被删除将不能被恢复
设计流程图,如图3-7所示:
图3-7 删除供应商信息流程图
相关代码如下:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.shanchuk1);
setTitle("删除供应商");
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
db = new SqlHelpdemo(getApplicationContext(), "store.db", null, 1);
sDatabase = db.getWritableDatabase();
listview = (ListView) findViewById(R.id.kehulist);
List> slist = new ArrayList>();
String selectStr = "select _id,comname,pername,addr,city,diqu,youbian,tel,chuangzhen,web from gongys";
Cursor cursor = sDatabase.rawQuery(selectStr, null);
cursor.moveToFirst();
int count = cursor.getCount();
id = new String[count];
cname = new String[count];
pname= new String[count];
add= new String[count];
city= new String[count];
diqu = new String[count];
youbian= new String[count];
tel= new String[count];
chuanzhen= new String[count];
web = new String[count];
do {
try {
id[i] = cursor.getString(0);
cname[i] = cursor.getString(1);
pname[i] = cursor.getString(2);
add[i] = cursor.getString(3);
city[i] = cursor.getString(4);
diqu[i] = cursor.getString(5);
youbian[i] = cursor.getString(6);
tel[i] = cursor.getString(7);
chuanzhen[i] = cursor.getString(8);
web[i] = cursor.getString(9);
i++;
} catch (Exception e) {
// TODO: handle exception
}
} while (cursor.moveToNext());
for (int i = 0; i < id.length; i++) {
Map map = new HashMap();
map.put("id", id[i]);
map.put("cname", cname[i]);
map.put("pname", pname[i]);
map.put("add", add[i]);
map.put("city", city[i]);
map.put("diqu", diqu[i]);
map.put("youbian", youbian[i]);
map.put("tel", tel[i]);
map.put("chuanzhen", chuanzhen[i]);
map.put("web", web[i]);
slist.add(map);
}
SimpleAdapter simple = new SimpleAdapter(this, slist,
R.layout.shanchukadpter, new String[] { "id", "cname", "pname",
"add" ,"city","diqu","youbian","tel","chuanzhen","web"}, new int[] { R.id.t1, R.id.t2, R.id.t3, R.id.t4,R.id.t5,R.id.t6,R.id.t7,R.id.t8,R.id.t9,R.id.t10,});
listview.setAdapter(simple);
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
for(int i=0;i
if(arg2==i){
builder.setTitle("确认消息");
builder.setMessage("确定要删除该客户吗?");
final int j=i;
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
sDatabase.execSQL("delete from gongys where comname='"+cname[j]+"'");
Intent intent=new Intent();
intent.setClass(Shanchug.this, Shanchug.class);
startActivity(intent);
finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
builder.create().show();
}
查询供应商信息步骤及处理流程如图3-8所示:
图3-8 查询供应商信息流程图
界面如图3-9所示:
图3-9 查询供应商信息图
相关代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shanchuk);
setTitle("查询供应商");
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
db = new SqlHelpdemo(getApplicationContext(), "store.db", null, 1);
sDatabase = db.getWritableDatabase();
listview = (ListView) findViewById(R.id.kehulist);
List> slist = new ArrayList>();
String selectStr = "select _id,comname,pername,addr,city,diqu,youbian,tel,chuangzhen,web from gongys";
Cursor cursor = sDatabase.rawQuery(selectStr, null);
cursor.moveToFirst();
int count = cursor.getCount();
id = new String[count];
cname = new String[count];
pname= new String[count];
add= new String[count];
city= new String[count];
diqu = new String[count];
youbian= new String[count];
tel= new String[count];
chuanzhen= new String[count];
web = new String[count];
do {
try {
id[i] = cursor.getString(0);
cname[i] = cursor.getString(1);
pname[i] = cursor.getString(2);
add[i] = cursor.getString(3);
city[i] = cursor.getString(4);
diqu[i] = cursor.getString(5);
youbian[i] = cursor.getString(6);
tel[i] = cursor.getString(7);
chuanzhen[i] = cursor.getString(8);
web[i] = cursor.getString(9);
i++;
} catch (Exception e) {
// TODO: handle exception
}
} while (cursor.moveToNext());
for (int i = 0; i < id.length; i++) {
Map map = new HashMap();
map.put("id", id[i]);
map.put("cname", cname[i]);
map.put("pname", pname[i]);
map.put("add", add[i]);
map.put("city", city[i]);
map.put("diqu", diqu[i]);
map.put("youbian", youbian[i]);
map.put("tel", tel[i]);
map.put("chuanzhen", chuanzhen[i]);
map.put("web", web[i]);
slist.add(map);
}
SimpleAdapter simple = new SimpleAdapter(this, slist,
R.layout.shanchukadpter1, new String[] { "id", "cname", "pname",
"add" ,"city","diqu","youbian","tel","chuanzhen","web"}, new int[] { R.id.t1, R.id.t2, R.id.t3, R.id.t4, R.id.t5,R.id.t6,R.id.t7,R.id.t8,R.id.t9,R.id.t10,});
listview.setAdapter(simple);
}
}
顾客是商品在出库操作时商品销售的对象。同供应商信息类似在进行入库操作时必须先添加该商品的供应商的信息。顾客的基本信息同供应商的类似,也都是必须要求输入的。同样对顾客信息的管理也提供了增加,删除,修改和查询功
能。
商品信息管理。商品的基本信息包括商品名称,商品规格,计量单位。这些都是必须输入的。用来记录商品的基本属性。
顾客和商品信息的操作过程与供应商的操作步骤和处理流程类似,在此不一一讲述。
3.3 库存信息管理
系统的核心功能在于入库、出库管理,这部分实现比较复杂,涉及到的数据和操作步骤都比较多。入库和出库的流程大体上是一样的,只有细节部分的区别。流程如图3-10所示。
在商品入库/出库之前必须建立一张入库/出库单,在该清单中记录了该次入库/出库过程的基本信息,包括供应商/客户名称、入库/出库时间、商品名称、商品规格、计量单位、单价、数量等等。仓库的入库/出库过程涉及到仓库的库存,关系到财产问题,与之相关的信息都很重要。所以本程序设计了修改入库/出库单的信息。下面将结合图片具体讲述实现过程。
1.入库操作:
入库操作的界面如图3-11所示:界面的左边是供货商信息和商品信息。为了保证入库信息准确无误,这两项用户不能自己填写,如果有新的供应商或新的商品必须先在基本信息管理中填加供应商信息和商品信息,然后从下拉列表中选择相信的供应商和商品。这样可以保证商品入库正确,保护财产安全。入库单右边是进货信息,包括本次商品入库时的单价和数量。因为每次进货时单价和数量都不一样,所以需要仓库管理员自己进行填写。进货日期默认为填单当日,也可以点下拉箭头进行时间选择。
图3-10 入库和出库的流程
入库操作步骤及处理流程:
(1) 选择库存信息管理->入库操作->添加入库商品信息
(2) 出现如图3-10所示对话框
(3) 从供货商信息的公司名称下拉列表中选择公司名称,从商品信息的商品名称下拉列表中选择商品名称,填写进货信息中的单价,数量,从进货日期下拉列表中选择时间,填好各项信息后点击保存
(4) 如果填写信息有误或者为空系统会提示重填
(5) 填写正确且点击保存后,显示入库商品信息,确定商品已经入库
用户可以继续添加入库信息,或者点返回进行其它操作
图3-11 添加入商品入库信息
相关代码如下:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tianjiar);
Intent inte = getIntent();
Bundle name = inte.getExtras();
names = inte.getStringExtra("username");
db = new SqlHelpdemo(getApplicationContext(), "store.db", null, 1);
sDatabase = db.getWritableDatabase();
Calendar c = Calendar.getInstance();
year = c.get(Calendar.YEAR);
mon = c.get(Calendar.MONTH);
day = c.get(Calendar.DAY_OF_MONTH);
da=year+"年"+(mon+1)+"月"+day+"日";
date = (DatePicker) findViewById(R.id.jhrqd);
date.init(year , mon ,day
, new OnDateChangedListener()
{
@Override
public void onDateChanged(DatePicker arg0, int year
, int month, int day)
{
Tianjiar.this.year = year;
Tianjiar.this.mon = month;
Tianjiar.this.day = day;
//显示当前日期、时间
da=year+"年"+(month+1)+"月"+day+"日";
System.out.println(da);
}
});
String selectStr = "select comname from gongys";
Cursor cursor = sDatabase.rawQuery(selectStr, null);
String selectStr1 = "select pname from products";
Cursor cursor1 = sDatabase.rawQuery(selectStr1, null);
cursor.moveToFirst();
cursor1.moveToFirst();
int count = cursor.getCount();
int count1 = cursor1.getCount();
gsname = new String[count];
spname = new String[count1];
do {
try {
gsname[i] = cursor.getString(0);
System.out.println(gsname[i]);
i++;
} catch (Exception e) {
// TODO: handle exception
}
} while (cursor.moveToNext());
do {
try {
spname[j] = cursor1.getString(0);
System.out.println(spname[j]);
j++;
} catch (Exception e) {
// TODO: handle exception
}
} while (cursor1.moveToNext());
BaseAdapter ba = new BaseAdapter() {
@Override
public int getCount() {
// 指定一共包含10个选项
return gsname.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
// 重写该方法,该方法返回的View将作为列表框的每项
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView text = new TextView(Tianjiar.this);
text.setText(gsname[position]);
text.setTextSize(20);
text.setTextColor(R.color.red);
return text;
}
};
gsmc.setAdapter(ba);
BaseAdapter ba1 = new BaseAdapter() {
@Override
public int getCount() {
// 指定一共包含10个选项
return spname.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
// 重写该方法,该方法返回的View将作为列表框的每项
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView text = new TextView(Tianjiar.this);
text.setText(spname[position]);
text.setTextSize(20);
text.setTextColor(R.color.red);
return text;
}
};
spmc.setAdapter(ba1);
gsmc.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
gs = gsname[arg2];
String selectStr2 = "select pername,tel from gongys where comname='"
+ gs + "'";
System.out.println("11111111111111");
Cursor cursor2 = sDatabase.rawQuery(selectStr2, null);
System.out.println("22222222222222");
cursor2.moveToFirst();
String name = null;
String tel = null;
do {
try {
name = cursor2.getString(0);
tel = cursor2.getString(1);
} catch (Exception e) {
// TODO: handle exception
name = "";
tel = "";
}
} while (cursor2.moveToNext());
lxr.setText(name);
lxdh.setText(tel);
}
@Override
public void onNothingSelected(AdapterView arg0) {
// TODO Auto-generated method stub
}
});
spmc.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
sp = spname[arg2];
String selectStr3 = "select pguige,pdanwei from products where pname='"
+ sp + "'";
System.out.println("11111111111111");
Cursor cursor3 = sDatabase.rawQuery(selectStr3, null);
cursor3.moveToFirst();
String guige = null;
String danwei = null;
do {
try {
guige = cursor3.getString(0);
danwei = cursor3.getString(1);
} catch (Exception e) {
// TODO: handle exception
guige = "";
danwei = "";
}
} while (cursor3.moveToNext());
spgg.setText(guige);
jldw.setText(danwei);
}
@Override
public void onNothingSelected(AdapterView arg0) {
// TODO Auto-generated method stub
}
});
}
public void save(View v) {
if(spdj.getText().toString().equals("")||spgs.getText().toString().equals("")){
DialogDemo.builder(Tianjiar.this, "提示", "请填写完整信息");
}
else{
// 查询语句
String elxr=lxr.getText().toString();
// 定义ID
int id = 0;
String select = "select max(_id) from ruku";
Cursor seCursor = sDatabase.rawQuery(select, null);
try {
seCursor.moveToFirst();
id = Integer.parseInt(seCursor.getString(0));
id += 1;
} catch (Exception e) {
// TODO: handle exception
id = 0;
}
sDatabase.execSQL("insert into ruku values('" + id + "','"
+ gs + "','" + elxr + "','" +elxdh+ "','"+sp+ "','"
+ espgg+ "','"+ejldw+ "','"+ espdj+ "','"+espgs+ "','"+da+ "')");
Toast.makeText(Tianjiar.this, "添加成功", Toast.LENGTH_LONG).show();
seCursor.close();
}
}
修改入库商品信息操作步骤:
(1) 选择要修改的入库商品信息
(2) 选择库存信息管理->入库操作->修改入库商品信息
(3) 用户可以修改入库单的基本信息,修改完后点保存
(4) 如果其中有空项或非法字符,会提示该项不能为空或输入不合要求.要求用户重新输入
(5) 更新入库商品信息列表。显示信息已经修改
(6) 用户可以继续加入入库商品信息或者点返回进行其它操作
删除入库商品信息步骤及处理流程:
(1) 选择要修改的入库商品信息
(2) 选择库存信息管理->入库操作->删除入库商品信息
(3) 如果没有选择入库商品信息,系统会提示没有选择入库商品,要求重新选择
(4) 更新供应商信息列表。显示信息已经被删除
(5) 信息一旦被删除将不能被恢复
查询入库商品信息步骤及处理流程:
(1) 选择库存信息管理->入库操作->查询入库商品信息
(2) 如果没有入库商品,系统会提示无入库商品无法查询
(3) 有入库商品会出现图3-12所示对话框
(4) 有两个选项供查询:商品名称和供应商名称。均无需输入,可直接从下拉列表中选择。
(5) 如果查找不到符合要求的信息,供应商列表为空。用户可以继续查找。
(6) 输入正确,入库商品列表会列出符合查找条件的信息供用户使用。
图3-12 添加入库
2.出库操作:
出库操作和入库操作的界面类似,这里不再作过多的讲述。只是将供应商信息改为了顾客信息。同样,顾客信息用户也是不能够自己填写的。如果有新的用户必须先在基本信息管理的顾客信息管理里面添加顾客信息。然后可以从下拉列表中选择用户信息。
相关代码如下:
public class Chaxunc extends Activity {
SqlHelpdemo db;
int i = 0;
SQLiteDatabase sDatabase = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.chaxunc1);
setTitle("查询出库");
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
db = new SqlHelpdemo(getApplicationContext(), "store.db", null, 1);
sDatabase = db.getWritableDatabase();
listview = (ListView) findViewById(R.id.kehulist);
List> slist = new ArrayList>();
String selectStr = "select _id,comname,pername,tel,products,guige,danwei,danjia,num,date from chuku";
Cursor cursor = sDatabase.rawQuery(selectStr, null);
cursor.moveToFirst();
int count = cursor.getCount();
id = new String[count];
do {
try {
id[i] = cursor.getString(0);
tel[i] = cursor.getString(7);
chuanzhen[i] = cursor.getString(8);
web[i] = cursor.getString(9);
i++;
} catch (Exception e) {
// TODO: handle exception
}
} while (cursor.moveToNext());
for (int i = 0; i < id.length; i++) {
Map map = new HashMap();
map.put("id", id[i]);
map.put("chuanzhen", chuanzhen[i]);
map.put("web", web[i]);
slist.add(map);
}
listview.setAdapter(simple);
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
for(int i=0;i
if(arg2==i){
builder.setTitle("确认消息");
builder.setMessage("确定要删除该出库吗?");
final int j=i;
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
sDatabase.execSQL("delete from chuku where comname='"+cname[j]+"'");
Intent intent=new Intent();
intent.setClass(Chaxunc.this, Chaxunc.class);
startActivity(intent);
finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
builder.create().show();
}
});
3.4 系统设置
系统设置包括三个子功能。登录注册,修改密码和退出。登录注册:用户注册后可以进行登录,进入主界面。修改密码:用户登入后可以修改自已的密码。建议用户定期更改自己的密码,以防信息泄露。退出:退出系统。
图3-13 用户管理模块
图3-14 修改密码
相关代码如下:
public class Xiugaik extends Activity {
private ListView listview;
String id[];
SqlHelpdemo db;
int i = 0;
SQLiteDatabase sDatabase = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.shanchuk1);
setTitle("修改客户");
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
db = new SqlHelpdemo(getApplicationContext(), "store.db", null, 1);
sDatabase = db.getWritableDatabase();
listview = (ListView) findViewById(R.id.kehulist);
List> slist = new ArrayList>();
String selectStr = "select _id,comname,pername,addr,city,diqu,youbian,tel,chuangzhen,web from guke";
Cursor cursor = sDatabase.rawQuery(selectStr, null);
cursor.moveToFirst();
int count = cursor.getCount();
id = new String[count];
do {
try {
id[i] = cursor.getString(0);
i++;
} catch (Exception e) {
// TODO: handle exception
}
} while (cursor.moveToNext());
for (int i = 0; i < id.length; i++) {
Map map = new HashMap();
map.put("id", id[i]);
slist.add(map);
}
SimpleAdapter simple = new SimpleAdapter(this, slist,
R.layout.shanchukadpter, new String[] { "id", "cname", "pname", "add" ,"city","diqu","youbian","tel","chuanzhen","web"}, new int[] { R.id.t1, R.id.t2, R.id.t3,
R.id.t4, R.id.t5,R.id.t6,R.id.t7,R.id.t8,R.id.t9,R.id.t10,});
listview.setAdapter(simple);
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
for(int i=0;i
if(arg2==i){
builder.setTitle("确认消息");
builder.setMessage("确定要修改该客户吗?");
final int j=i;
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Intent intent=new Intent();
Bundle bundle = new Bundle();
bundle.putString("compname",cname[j]);
intent.putExtras(bundle);
intent.setClass(Xiugaik.this, Xiugaik1.class);
startActivity(intent);
finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub }
});
builder.create().show();
}
}
3.5 关于
本程序作者以及版本信息。
3.6相关技术
本项目利用 SQLite 建立数据库后台,使用Eclipse开发工具,利用其提供的各种面向对象的开发工具进行开发。其中利用的主要手段有:
1)游标cursor:用于在SQLLite数据库中查找数据;
2)LayoutInflater:LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。
对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。
3)分页TabHost:TabHost是整个Tab的容器,包含TabWidget和FrameLayout两个部分,TabWidget是每个Tab的表情,FrameLayout是Tab内容。
l 使用OnTabChangeListener接口,重写OnTabChanged(String tabId)函数
l TabHost绑定监听器
l 判断OnTabChanged(String tabId)中的tabId参数进行处理事件;
这里的tabId对应的是实例中每个分页传入的分页ID,
而不是TabSpec.setIndicatior()设置的标题
4)List>使用Java代码遍历以获取String,Object的值。
5)适配器SimpleAdapter(this,Resource, new String[],new int[])
第一个context,SimpleAdapter所要运行关联到的视图,
第二个是一个泛型只要是一个List就行,这一般会想到是ArrayList,而他内部存储的则是Map或者继承自Map的对象,比如HashMap,作为数据源,而且每一个ArraList中的一行就代表着呈现出来的一行,Map的键就是这一行的列名,值也是有列名的。
第三个资源文件,就是说要加载这个两列所需要的视图资源文件,一般在Layout建立相应的.xml文件,可以左边一个TextView右边一个TextView,目的在于呈现左右两列的值!
第四个参数是一个String数组,主要是将Map对象中的名称映射到列名,一一对应;
第五个是将第四个参数的值一一对象的显示(一一对应)在接下来的int形的id数组中,这个id数组就是LayOut的xml文件中命名id形成的唯一的int型标识符。
4项目总结及展望
金源书店金源书店库存管理系统的总目标是:在数据库和先进的开发平台上,利用现有资源,开发一个体系结构完善的、易扩充的、易维护的、具有良好人机交互界面的金源书店库存管理系统,实现仓库的移动设备管理,提供完善的功能,为仓库管理人员提供便利的工作方式。此次项目应用Eclipse开发平台,以及Android系统集成的一个轻量级的数据库:SQLite。综合应用两者进行开发,终于完成此次课程设计的目标。在此次课程设中虽然费了不少力,但项目依然有其本身存在的不足,下面将本项目的不足及展望描述如下:
1)管理员权限未进行划分:根据管理员表中的管理类别进行划分超级管理员与普通管理员的权限;超级管理员可查看普通管理员的个人信息以及重置普通管理员的登录密码,普通管理员只能 查看个人信息并修改个人密码。
2)未实现按条件查询:在查询商品、供应商、顾客基本信息及库存信息时可设置输入相关条件,根据条件可查询单条信息,也可以查询多条信息,并对此设置监听,实现按条件查询数据表中的相关信息。
3)为实现注册后登录页面的返回:在用户进行注册后点击确定应该返回到登录界面进行登录。
5心得体会
此次课程设计在不断的学习中摸索着前进,在前期的学习中没有将知识点重视起来,此次课程设计让我体会到基础的重要性,书上的基础知识是一切进步的根源,此次课程设计也让我体会到制作一个完整的程序需要有很强的逻辑分析,前期的需求分析,功能实现,模块划分尤其重要。其次是在原有基础知识的前提下,对于功能的实现需要借助查阅资料,在这个过程中也会学到很多新的非常有用的知识,最后是在此次课程设计中还有最重要的一点及团队合作的重要性,和队友一起完成,不仅考验队友间的合作与分工,还考验化解内部矛盾、相互学习、相互鼓励帮助、协同合作的能力。所以说课程设计也许是一场灾难,但所谓上天总是比较眷顾克服困难的人,你下的功夫越多,你的收获越多,你在一个陌生的领域里成长的也就越多。感谢此次课程设计让我在各方面都收获成长,感谢老师的辛勤付出!
经过1个月的课程设计,我将这学期所学课程进行了系统的总结,最重要的是将所学知识应用于实践,并学习如何开发完成一个完整的项目。在此课程设计期间,我所学到的知识更加巩固,尤其是Simple Adapter、Tabhost、Listview、Intent、Bunder等,对一些视图组件及其监听方法的实现进行了深入的了解和研究。同时,熟悉了database Helper 数据库的应用,尤其是对数据库表中的信息进行增、删、查、改的操作应用。
此次课程设计,不仅使我巩固和实践了anbroid课程知识,同时使我体会到了团队合作的重要性,和队友一起进行课程设计的过程中,我们一起协商、探讨,从需求分析到功能开发与实现,尽管经历了很多困难,如功能无法实现、代码调试出错等,但共同设法一一解决时,收获的是无与伦比的愉悦。因此,此次课程设计对我的帮助不仅是在专业课程上更是会影响今后的工作生活。我相信今后会更懂得团队合作和克服困难、解决问题。最后,非常感谢程老师为我们提供此次机会并对我们进行指导,感谢共同奋斗的队友的一路相伴。
经过将近一个月的课程设计,不仅使我将在课堂上学到的东西得到了巩固,并且能够做到学以致用,真正用到了实际的开发项目中,而且也锻炼了我的自学开拓的能力。在此次项目开发中,我负责了两大模块:商品管理和用户管理以及一些小小的系统设置,如退出、关于等。我学会了如何使用一些基本的UI组件以及简单的UI界面设计,Button按钮的事件监听,页面与页面之间的跳转的Intent实例,熟悉了database Helper 数据库的增、删、改、查的应用等,同时也回顾了以前学习过的课程JAVA、数据库等的知识。当然,此次项目的开发也锻炼了我与团队合作的精神与能力,在这个过程中,我们小组遇到了很多问题,在问题面前,我们先是小组里讨论,未能解决,我们就向其他同学、老师求教或者上网查询,想尽一切办法解决问题。我自认为,我们的小组合作的很愉快!这次课程设计的经历,无论是从知识的学习上、解决问题的能力上,还是团队合作上都使我提高了很多,也成长了许多,这将是我人生中不可抹去的一段宝贵的经历!
参 考 文 献
1 张荣.Android开发与应用.人民邮电出版社,2014
2 黄维通.SQL Server 2000简明教程[M].北京:清华大学出版社,2002
3李刚.疯狂Android讲义[M].北京:电子工业出版社,2012
4 朱桂英.Android开发应用从入门到精通[M].北京:中国铁道出版社, 2011
5 萨师煊,王珊.数据库系统概论.第三版[M].北京:高等教育出版社,2000
6 张海藩.软件工程[M].北京:人民邮电出版社,2002.11
7 李宣东,李存珠 .软件工程概论[M] . 南京:南京大学计算机系,2001
8史九林.数据库概论[M].西安:西安电子科技大学出版社, 1988