校园淘二手交易APP

每一次课设都是一次进步的机会!

在这次课设中,我学到了一些以前从未接触到的知识,比如如何生成验证码,如何使用腾讯开放平台注册并获取APP ID和APP KEY实现QQ互联接入,如何实现Spinner下拉列表以及实现它的点击事件,如何通过SQLite数据库实现增删改查并通过图形化工具SQLite Expert Professional查看db文件来显式的查看数据,如何通过Intent实现复杂数据的传递,如何使用Log来追踪app的运行,这些应该是我这次最大的收获。

一、总体设计思想

通过当今互联网的大平台,考虑到大学生校园二手交易的高效性和安全性,利用目前所学的Android知识设计出此APP。主要将系统划分为以下几个模块:用户登录授权模块,具备用户注册(用户名和密码设定)、登录验证(包括用户名、密码和验证码的验证)、第三方授权功能;商品分类模块,具备将各类商品分门别类的功能;热销模块,以列表形式呈现,点击每一个子列表都会呈现具体发布信息,可以采用星级评分条进行打分并评论;发布商品模块,具备添加文字功能,可以发布具体商品信息;个人管理模块,具备修改并保存个人信息,修改密码,查看我的发布,退出登录功能;我的发布模块,具备管理我的发布信息功能,可进行手动刷新和删除操作。

二、系统流程分析

三、各模块功能分析与设计

四、详细设计与实现

1、数据库设计

需要学习可参考:添加链接描述

使用SQLite图形化工具SQLite Expert Professional查看db文件
包含三张表:用户信息users表,商品信息iteminfo表,评论信息comments表。
(1)用户信息users表,通过此表可定义每个用户在数据库中存储的基本信息。使用模块:用户登录授权模块、注册模块及个人信息管理模块。用七个字段分别表示用户的userId(账号)、passWord(登录密码)、name(真实姓名)、subject(所学专业)、phone(联系方式)、qq(qq号)及address(地址)。其中,设置userId为主键,passWord不能为空,如图所示:

建立脚本(基于SQLite数据库实现),代码如下:

db.execSQL("create table if not exists users" +"(userId varchar(20) primary key," +"passWord varchar(20) not null," +"name varchar(20)," +"subject varchar(20)," +"phone varchar(15)," +"qq varchar(15)," +"address varchar(50))");

(2)商品信息iteminfo表,通过此表可定义每条被发布的商品列表项在数据库中存储的基本信息。使用模块:商品热销模块、商品分类模块、商品信息发布模块及我的发布管理模块。用八个字段分别表示商品信息的id(商品编号)、userId(发布者ID)、title(标题)、kind(类别)、info(描述)、price(价格)、time(发布时间)及contact(联系方式)。其中,设置id为主键,如图所示:

建立脚本(基于SQLite数据库实现),代码如下:

db.execSQL("create table if not exists iteminfo(" +"id integer primary key  AUTOINCREMENT," +"userId varchar(100)," +"title varchar(200)," +"kind varchar(100)," +"info varchar(1000)," +"price varchar(100)," +"time DATETIME," +"contact varchar(50))");

(3)评论信息comments表,通过此表可定义每条评论在数据库中存储的基本信息。使用模块:商品评论模块。用五个字段分别表示userId(评论者ID)、itemId(列表项ID)、comment(评论)、textView(星级评价条打分)及time(评论时间)。不设置主键,如图所示:

建立脚本(基于SQLite数据库实现),代码如下:

db.execSQL("create table if not exists comments(" +"userId varchar(100)," +"itemId integer," +"comment varchar(1000)," +"textView varchar(100),"+"time DATETIME)");

2、界面设计与实现(我太喜欢做界面了hhh)

这是我的小可爱APP图标!

<1> 欢迎界面

<2> 登录界面

<3> 第三方授权界面-QQ

<4> 注册界面

<5> 主界面-首页

<6> 商品发布界面

<7> 我的发布界面

<8> 商品分类界面-书籍(美妆、电子产品、体育用品同理)

<9> 商品评论界面

<10> 个人中心界面

<11> 个人信息界面

<12> 修改密码界面

3、主要功能模块实现

(由于代码比较多,下面只记录重要的功能)

<1> 用户登录授权模块

//将所输入的用户名和密码与数据库中的数据进行比较判断是否能够登陆成功
private void checkUser(String user, String password) {dbhelper = new DBOpenHelper(this);db=dbhelper.getReadableDatabase();try{String sql="SELECT * FROM users WHERE userId=? and passWord=?";Cursor cursor=db.rawQuery(sql,new String[]{user,password});if(cursor.getCount()==0){Toast.makeText(getApplicationContext(), "用户名或密码错误!", Toast.LENGTH_SHORT).show();}else{Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show();Intent intent = new Intent(LoginActivity.this,MainActivity.class);post_userid=user;startActivity(intent);}cursor.close();db.close();}catch (SQLiteException e){Toast.makeText(getApplicationContext(), "登录失败", Toast.LENGTH_SHORT).show();}
}
//注册验证if (!TextUtils.isEmpty(user) && !TextUtils.isEmpty(password1) &&  !TextUtils.isEmpty(password2) && password1.equals(password2)&& phoneCode.equals(realCode)) {checkUser(user, password1);}else if(user==null||user.equals("")){Toast.makeText(getApplicationContext(), "请输入用户账号!", Toast.LENGTH_SHORT).show();}else if(password1==null||password1.equals("")){Toast.makeText(getApplicationContext(), "请输入密码!", Toast.LENGTH_SHORT).show();}else if(!password1.equals(password2)){Toast.makeText(getApplicationContext(), "两次输入的密码不一致!", Toast.LENGTH_SHORT).show();} else if(!phoneCode.equals(realCode)){Toast.makeText(RegisterActivity.this, "验证码错误", Toast.LENGTH_SHORT).show();mIvRegisteractivityShowcode.setImageBitmap(Code.getInstance().createBitmap());realCode = Code.getInstance().getCode().toLowerCase();Log.i(TAG,"realCode为"+realCode);
}
//检查账号是否存在
private void checkUser(String user, String password1) {dbhelper = new DBOpenHelper(this);db=dbhelper.getReadableDatabase();try{String sql="SELECT * FROM users WHERE userId=?";Cursor cursor=db.rawQuery(sql,new String[]{user});if(cursor.getCount()>0){Toast.makeText(getApplicationContext(), "账号已存在!", Toast.LENGTH_SHORT).show();}else{ContentValues values = new ContentValues();//开始组装第一条数据   //账号userId,密码passWord,姓名name,专业subject,电话phone,QQ号qq,地址addressvalues.put("userId",user);values.put("passWord",password1);db.insert("users",null,values);//插入第一条数据Toast.makeText(getApplicationContext(), "注册成功,请登录", Toast.LENGTH_SHORT).show();Intent intent = new Intent(RegisterActivity.this,LoginActivity.class);startActivity(intent);}cursor.close();db.close();}catch (SQLiteException e){Toast.makeText(getApplicationContext(), "注册失败", Toast.LENGTH_SHORT).show();}
}

实现QQ第三方授权登录的qqActivity类:

需要学习可参考:Android实现第三方QQ登录

public class qqActivity extends AppCompatActivity {//QQ登录申请的appidpublic static final String QQ_APP_ID = "1110228647";//布局控件private Button btnLogIn;private ImageView headerLogo;private TextView tvNickName;private TextView openId;//显示获取到的头像和昵称private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == 0) {//获取昵称tvNickName.setText((CharSequence) msg.obj);//String实现了CharSequence接口} else if (msg.what == 1) {//获取头像headerLogo.setImageBitmap((Bitmap) msg.obj);}}};//需要腾讯提供的一个Tencent类private Tencent mTencent;//还需要一个IUiListener 的实现类(LogInListener implements IUiListener)private LogInListener mListener;//用来判断当前是否已经授权登录,若为false,点击登录button时进入授权,否则注销private boolean isLogIned = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_qq);//首先需要用APP ID 获取到一个Tencent实例//Tencent类是SDK的主要实现类,开发者可通过Tencent类访问开放的OpenAPImTencent = Tencent.createInstance(QQ_APP_ID, this.getApplicationContext());//初始化一个IUiListener对象,在IUiListener接口的回调方法中获取到有关授权的某些信息// (需要覆写onActivityResult方法,成功接收到回调)mListener = new LogInListener();//初始化各控件initView();}private void initView() {btnLogIn = (Button) findViewById(R.id.mainQQ_btn_login);headerLogo = (ImageView) findViewById(R.id.mainQQ_iv_user_logo);tvNickName = (TextView) findViewById(R.id.mainQQ_tv_user_nickname);openId = (TextView) findViewById(R.id.mainQQ_tv_user_openid);btnLogIn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (!isLogIned) {isLogIned = true;//调用QQ登录,用IUiListener对象作参数if (!mTencent.isSessionValid()) {mTencent.login(qqActivity.this, "all", mListener);}} else {//调用QQ注销接口mTencent.logout(qqActivity.this);isLogIned = false;Toast.makeText(qqActivity.this, "登录已注销!", Toast.LENGTH_SHORT).show();}}});}//LogInListener是IUiListener的实现类,其中的回调方法用来接收授权后的相关信息private class LogInListener implements IUiListener{@Overridepublic void onComplete(Object o) {Toast.makeText(qqActivity.this, "授权成功!", Toast.LENGTH_LONG).show();System.out.println("o.toString() ------------------------->        " + o.toString());JSONObject jsonObject = (JSONObject) o;//设置openid和token,否则获取不到下面的信息initOpenidAndToken(jsonObject);//获取QQ用户的各信息getUserInfo();}@Overridepublic void onError(UiError uiError) {Toast.makeText(qqActivity.this, "授权出错!", Toast.LENGTH_LONG).show();}@Overridepublic void onCancel() {Toast.makeText(qqActivity.this, "授权取消!", Toast.LENGTH_LONG).show();}}//登录成功后调用public void onComplete(JSONObject arg0) 回传的JsonObject, 其中包含OpenId, AccessToken等重要数据//{//"ret":0,//"pay_token":"xxxxxxxxxxxxxxxx",//"pf":"openmobile_android",//"expires_in":"7776000",//"openid":"xxxxxxxxxxxxxxxxxxx",//"pfkey":"xxxxxxxxxxxxxxxxxxx",//"msg":"sucess",//"access_token":"xxxxxxxxxxxxxxxxxxxxx"//}//初始化OPENID和TOKEN值(为了得到用户信息)private void initOpenidAndToken(JSONObject jsonObject) {try {String openid = jsonObject.getString("openid");openId.setText(openid);String token = jsonObject.getString("access_token");String expires = jsonObject.getString("expires_in");if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires)&& !TextUtils.isEmpty(openid)) {mTencent.setAccessToken(token, expires);mTencent.setOpenId(openid);}} catch (JSONException e) {e.printStackTrace();}}//sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我们可以通过这个类拿到这些信息//采用同步调用方式(由于同步调用直接访问网络,是延时性操作,需要放入线程中执行)private void getUserInfo() {QQToken mQQToken = mTencent.getQQToken();UserInfo userInfo = new UserInfo(qqActivity.this, mQQToken);userInfo.getUserInfo(new IUiListener() {@Overridepublic void onComplete(final Object o) {JSONObject userInfoJson = (JSONObject) o;//                {
//                        "ret": 0,
//                        "msg": "",
//                        "is_lost": 0,
//                        "nickname": "维他命",
//                        "gender": "女",
//                        "province": "天津",
//                        "city": "滨海新区",
//                        "figureurl": "http://qzapp.qlogo.cn/qzapp/1110228647/CB74B8982DFC8EB1ABE233BAF946435B/30",
//                        "figureurl_1": "http://qzapp.qlogo.cn/qzapp/1110228647/CB74B8982DFC8EB1ABE233BAF946435B/50",
//                        "figureurl_2": "http://qzapp.qlogo.cn/qzapp/1110228647/CB74B8982DFC8EB1ABE233BAF946435B/100",
//                        "figureurl_qq_1": "http://q.qlogo.cn/qqapp/1110228647/CB74B8982DFC8EB1ABE233BAF946435B/40",
//                        "figureurl_qq_2": "http://q.qlogo.cn/qqapp/1110228647/CB74B8982DFC8EB1ABE233BAF946435B/100",
//                        "is_yellow_vip": "0",
//                        "vip": "0",
//                        "yellow_vip_level": "0",
//                        "level": "0",
//                        "is_yellow_year_vip": "0"
//                }Message msgNick = new Message();msgNick.what = 0;//昵称try {msgNick.obj = userInfoJson.getString("nickname");//直接传递一个昵称的内容过去} catch (JSONException e) {e.printStackTrace();}mHandler.sendMessage(msgNick);//子线程 获取并传递头像图片,由Handler更新new Thread(new Runnable() {@Overridepublic void run() {Bitmap bitmapHead = null;if (((JSONObject) o).has("figureurl")) {try {String headUrl = ((JSONObject) o).getString("figureurl_qq_2");bitmapHead = Util.getbitmap(headUrl);} catch (JSONException e) {e.printStackTrace();}Message msgHead = new Message();msgHead.what = 1;msgHead.obj = bitmapHead;mHandler.sendMessage(msgHead);}}}).start();btnLogIn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(qqActivity.this,MainActivity.class));finish();}});}@Overridepublic void onError(UiError uiError) {Log.e("GET_QQ_INFO_ERROR", "获取qq用户信息错误");Toast.makeText(qqActivity.this, "获取qq用户信息错误", Toast.LENGTH_SHORT).show();}@Overridepublic void onCancel() {Log.e("GET_QQ_INFO_CANCEL", "获取qq用户信息取消");Toast.makeText(qqActivity.this, "获取qq用户信息取消", Toast.LENGTH_SHORT).show();}});}//确保能接收到回调@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);Tencent.onActivityResultData(requestCode, resultCode, data, mListener);}
}

自定义的Util类如下:

public class Util {public static String TAG="UTIL";public static Bitmap getbitmap(String imageUri) {Log.v(TAG, "getbitmap:" + imageUri);// 显示网络上的图片Bitmap bitmap = null;try {URL myFileUrl = new URL(imageUri);HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();conn.setDoInput(true);conn.connect();InputStream is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(is);is.close();Log.v(TAG, "image download finished." + imageUri);} catch (IOException e) {e.printStackTrace();Log.v(TAG, "getbitmap bmp fail---");return null;}return bitmap;}}

<2> 商品热销模块

//打开数据表iteminfo查询所有数据,然后将一组数据存放在一个Map里,各组数据存放在一个ArrayList里
dbHelper = new DBOpenHelper(this);
db = dbHelper.getWritableDatabase();//打开数据库
data = new ArrayList<>(); // 列表
Cursor cursor = db.query(TABLENAME,null,null,null,null,null,null,null); // 数据库查询
if (cursor.moveToFirst()){while (!cursor.isAfterLast()){item = new HashMap<String, Object>();  // 为列表项赋值item.put("id",cursor.getInt(0));item.put("userid",cursor.getString(1));item.put("title",cursor.getString(2));item.put("kind",cursor.getString(3));item.put("info",cursor.getString(4));item.put("price",cursor.getString(5));cursor.moveToNext();data.add(item); // 加入到列表中}
}// 使用MydefineAdapter布局listview
MydefineAdapter mydefineAdapter = new MydefineAdapter(this,R.layout.listitem,data);
listview.setAdapter(mydefineAdapter);
// 为列表项设置监听器
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {intent = new Intent(MainActivity.this, item_info.class);// 获取该列表项的key为id的键值,即商品的id,将其储存在Bundle传递给打开的页面intent.putExtra("id", data.get(position).get("id").toString()); startActivity(intent);}
});/*自定义适配器需继承BaseAdapter,并重写其四个方法*/
public class MydefineAdapter extends BaseAdapter {private Context context;private ArrayList<Map<String,Object>> data;private int item_layout_id;public MydefineAdapter(Context context,int item_layout_id,ArrayList<Map<String,Object>> data){this.context=context;this.data=data;this.item_layout_id=item_layout_id;}//返回适配器要包含的数据项数量@Overridepublic int getCount() {return data.size();}//返回数据集中position位置的数据对象(从0开始)@Overridepublic Object getItem(int position) {return data.get(position);}//返回position位置的列表项的ID@Overridepublic long getItemId(int position) {return position;}//返回position位置的绑定数据后的视图组件,其中convertview表示缓冲绘制好的视图组件,parent是convertview的父视图//使用view参数作为缓存进行优化,减少了重绘view的次数@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder=null;//声明缓存布局中所有视图组件的对象引用//判断有无可重用的View,若无就重新绘制if(convertView==null){viewHolder=new ViewHolder();//LayoutInflater的作用是,将xml布局文件实例化为它对应的View对象convertView= LayoutInflater.from(context).inflate(item_layout_id,parent,false);viewHolder.title=(TextView) convertView.findViewById(R.id.title);viewHolder.kind=(TextView)convertView.findViewById(R.id.kind);viewHolder.info=(TextView)convertView.findViewById(R.id.info);viewHolder.price=(TextView)convertView.findViewById(R.id.price);convertView.setTag(viewHolder);//为view设置标签并把viewHolder存储在标签中}else{viewHolder=(ViewHolder)convertView.getTag();}Map<String,Object>item=(Map<String, Object>) getItem(position);viewHolder.title.setText((String)item.get("title"));viewHolder.kind.setText((String)item.get("kind"));viewHolder.info.setText((String)item.get("info"));viewHolder.price.setText((String)item.get("price"));return convertView;}//定义内部类ViewHolder减少调用findViewByIdprivate class ViewHolder{public TextView title;public TextView kind;public TextView info;public TextView price;}
}
//接收从上一个intent传递过来的id,把通过这个id在数据表iteminfo中查询的信息赋给相应的布局控件
dhelper = new DBOpenHelper(this);
db = dhelper.getWritableDatabase();
intent = getIntent();
initview();
Cursor cursor = db.query("iteminfo",null,"id=?",new String[]{intent.getStringExtra("id")},null,null,null,null); // 根据接收到的id进行数据库查询
Log.i("商品的id是",intent.getStringExtra("id"));
if (cursor.moveToFirst()){while (!cursor.isAfterLast()){userId.setText(cursor.getString(1));title.setText(cursor.getString(2));price.setText(cursor.getString(5));time.setText(cursor.getString(6));info.setText(cursor.getString(4));contact.setText(cursor.getString(7));cursor.moveToNext();}
}
//接收从上一个intent传递过来的id,通过这个id在数据库里查询到的每一组数据存储在一个Map里,然后把所有组数据存储到一个List里
data=new ArrayList<Map<String, Object>>(); // 列表
Cursor cursor_ = db.query("comments",null,"itemId=?",new String[]{intent.getStringExtra("id")},null,null,null,null); // 数据库查询
if (cursor_.moveToFirst()){while (!cursor_.isAfterLast()){item = new HashMap<String, Object>();  // 为列表项赋值item.put("userId",cursor_.getString(0));item.put("comment",cursor_.getString(2));item.put("textView",cursor_.getString(3));item.put("time",cursor_.getString(4));cursor_.moveToNext();data.add(item); // 加入到列表中}
}
/*创建RatingBar监听器 */
chooseRatingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {@Overridepublic void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {chooseRatingBar = (RatingBar) findViewById(R.id.ratingBar1);chooseRatingBar.setRating(rating);textView.setText("选择了" + rating + "个星星");}
});
//给提交评论按钮设置事件监听器
Button submit = (Button)findViewById(R.id.submit);
submit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {EditText comment = (EditText)findViewById(R.id.comment);String submit_comment = comment.getText().toString();TextView textView= (TextView) findViewById(R.id.textView1);String star_textview=textView.getText().toString();SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");Date curDate = new Date(System.currentTimeMillis());String time = formatter.format(curDate);ContentValues values=new ContentValues();values.put("userId",post_userid);values.put("itemId",intent.getStringExtra("id"));values.put("comment",submit_comment);values.put("textView",star_textview);values.put("time",time);db.insert("comments",null,values);Log.i("1","评论成功");Toast.makeText(getApplicationContext(), "评论成功", Toast.LENGTH_SHORT).show();Intent intent_=new Intent(item_info.this,item_info.class);intent_.putExtra("id",intent.getStringExtra("id"));startActivity(intent_);}
});

<3> 商品发布+分类模块

String[] ctype;
ctype = new String[]{"美妆", "书籍", "电子产品", "体育用品"};
//创建一个数组适配器
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,ctype);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //设置下拉列表框的下拉选项样式
sp= (Spinner) super.findViewById(R.id.m1_style);
sp.setAdapter(adapter);//将适配器添加到下拉列表上
sp.setOnItemSelectedListener(this);
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {kind = (sp.getSelectedItem()).toString();
}
public void onNothingSelected(AdapterView<?> parent) {
}
//给发布按钮添加事件监听器
fabu.setOnClickListener(new View.OnClickListener() {@RequiresApi(api = Build.VERSION_CODES.O)@Overridepublic void onClick(View v) {EditText title=(EditText)findViewById(R.id.m1_title);EditText price=(EditText)findViewById(R.id.m1_price);EditText phone=(EditText)findViewById(R.id.m1_phone);EditText nr=(EditText)findViewById(R.id.m1_nr);Date curDate = new Date(System.currentTimeMillis());String time = formatter.format(curDate);ContentValues values=new ContentValues();values.put("title",title.getText().toString());values.put("userId",post_userid);values.put("kind", kind);values.put("time",time);values.put("price",price.getText().toString());values.put("contact",phone.getText().toString());values.put("info",nr.getText().toString());db.insert("iteminfo",null,values);Intent intent=new Intent(AddItem.this,AddItem.class);Toast.makeText(getApplicationContext(), "发布成功", Toast.LENGTH_SHORT).show();startActivity(intent);finish();}
});
//将在数据库中查找的类别是“美妆”的每组数据组装成一个Map,再将所有数据存储在List里面(书籍类,电子产品类,体育用品类同理)
dbHelper = new DBOpenHelper(this);
db = dbHelper.getWritableDatabase();
item = new HashMap<>();
data = new ArrayList<>();
Cursor cursor = db.query(TABLENAME,null,"kind=?",new String[]{"美妆"},null,null,null,null); // 数据库查询
if (cursor.moveToFirst()){while (!cursor.isAfterLast()){item = new HashMap<String, Object>();  // 为列表项赋值item.put("id",cursor.getInt(0));item.put("userid",cursor.getString(1));item.put("title",cursor.getString(2));item.put("kind",cursor.getString(3));item.put("info",cursor.getString(4));item.put("price",cursor.getString(5));cursor.moveToNext();data.add(item); // 加入到列表中}
}

<4> 个人中心管理+我的发布管理模块

//获取登录时的账户账号,也就是发布者的账号,通过该账号在数据库中查询发布的商品信息
Cursor cursor = db.query(TABLENAME,null,"userId=?",new String[]{a},null,null,null,null); // 数据库查询
if (cursor.moveToFirst()){while (!cursor.isAfterLast()){item = new HashMap<String, Object>();  // 为列表项赋值item.put("id",cursor.getInt(0));item.put("userId",cursor.getString(1));item.put("title",cursor.getString(2));item.put("kind",cursor.getString(3));item.put("info",cursor.getString(4));item.put("price",cursor.getString(5));cursor.moveToNext();data.add(item); // 加入到列表中}
}
//长按可删除该列表项的监听器
listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {String delId = data.get(position).get("id").toString();if(db.delete(TABLENAME,"id=?",new String[]{delId}) > 0) {Toast.makeText(getApplicationContext(), "删除成功,请刷新", Toast.LENGTH_SHORT).show();return true;}else {return false;}}
});
//保存修改过后的信息,将数据库中的信息更新
private void saveValues(ContentValues values) {DBOpenHelper dbhelper = new DBOpenHelper(this);SQLiteDatabase db=dbhelper.getReadableDatabase();db.update("users",values,"userId=?",new String[] {id});db.close();
}
//验证用户旧密码是否输入正确,将新密码存入数据库
private void checkpass(String oldpass, String newpass) {DBOpenHelper dbhelper = new DBOpenHelper(this);SQLiteDatabase db=dbhelper.getReadableDatabase();try{String sql="SELECT * FROM users WHERE userId=? and passWord=?";Cursor cursor=db.rawQuery(sql,new String[]{user,oldpass});if(cursor.getCount()==0){Toast.makeText(getApplicationContext(), "用户旧密码错误!", Toast.LENGTH_SHORT).show();}else{ContentValues values=new ContentValues();values.put("passWord",newpass);db.update("users",values,"userId=?",new String[] {user});Toast.makeText(getApplicationContext(), "修改成功", Toast.LENGTH_SHORT).show();Intent intent = new Intent(changepwdActivity.this,MyselfActivity.class);startActivity(intent);}cursor.close();db.close();}catch (SQLiteException e){Toast.makeText(getApplicationContext(), "修改失败", Toast.LENGTH_SHORT).show();}
}

fighting together!

源码下载

移动终端课程设计——校园淘二手交易APP相关推荐

  1. 二手手机交易平台使用MYSQL的方法_安卓Android校园淘(二手交易)APP设计与实现(MySQL)...

    安卓Android校园淘(二手交易)APP设计与实现(MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文14000字,程序代码,MySQL数据库) 本项目就是一个基于Androi ...

  2. 计算机网络题简单建设校园网络,计算机网络课程设计—校园网络构建方案设计和实现.doc...

    计算机网络课程设计-校园网络构建方案设计和实现 <计算机网络>课程设计报告 题目:校园网络构建方案设计和实现 组别/组长: 专 业: 计算机网络技术 院 系: 信息工程学院 信息工程学院制 ...

  3. 计算机网络题简单建设校园网络,计算机网络课程设计校园网络构建方案设计和实现.doc...

    计算机网络课程设计校园网络构建方案设计和实现 <计算机网络>课程设计报告 题目:校园网络构建方案设计和实现 组别/组长: 专 业: 计算机网络技术 院 系: 信息工程学院 信息工程学院制目 ...

  4. java计算机毕业设计基于安卓Android/微信小程序的校园闲置二手交易平台APP

    项目介绍 网络技术的快速发展给各行各业带来了很大的突破,也给各行各业提供了一种新的管理模式,校园二手交易平台小程序将是又一个从传统管理到智能化信息管理的典型案例,对于传统的校园二手交易,所包括的信息内 ...

  5. 二手交易app开发可以定制哪些功能

    二手交易app开发可以定制哪些功能,主要有推送闲置物品信息.闲置物品显示.交易安全.双方沟通平台.在线预约.商品分类功能.在线支付.产品上下架等. 二手交易app开发定制的功能 1.推送闲置物品信息 ...

  6. 二手交易APP开发主要功能有哪些?(二)

    二手交易APP开发主要功能有哪些?(二) 在线服务:二手交易手机应用软件.小程序的在线服务功能,为买家与卖家提供互相咨询了解与解答的途径,促进买卖家之间交流互动. 在线预约:通过在线预约功能,提供卖家 ...

  7. 二手交易APP开发主要功能有哪些?(一)

    二手交易APP开发主要功能有哪些?随着我们生活水平的提高以及智能手机的普及,把二手交易与互联网有效结合已成为二手市场新的机会,比如二手车.生活闲置物交易.家电换购.旧物换钱等等.但有很多企业商家有这个 ...

  8. HTML5响应式手机模板:电商网站设计——仿淘宝手机app界面模板源码 HTML+CSS+JavaScript...

    HTML5响应式手机模板:电商网站设计--仿淘宝手机app界面模板源码 HTML+CSS+JavaScript 手机电商模板 手机网站模板 企业手机网站模板 手机网站模板 手机模板 响应式手机网站 h ...

  9. HTML5响应式手机模板:电商网站设计——仿淘宝手机app界面模板源码 HTML+CSS+JavaScript

    HTML5响应式手机模板:电商网站设计--仿淘宝手机app界面模板源码 HTML+CSS+JavaScript 手机电商模板 手机网站模板 企业手机网站模板 手机网站模板 手机模板 响应式手机网站 h ...

  10. Android课设之校园二手交易app

    好了,这学期的Android课设基本完工了,我这次选取的是校园二手交易的主题.好了,相信大家也都等不及了,接下来直接进行演示了.代码已经上传到GitHub上,链接为https://github.com ...

最新文章

  1. 0x13.基础数据结构 — 链表与邻接表
  2. 统计计量 | 协方差和相关系数的暧昧关系:共性与个性
  3. webstom设置和monokia配色方案
  4. java启动监听器报错_JAVA通过JDBC连接Oracle数据库详解【转载】
  5. SCUT - 254 - 欧洲爆破 - 概率dp - 状压dp
  6. 2020微信生态全景运营白皮书:10大热门场景、5大案例剖析.pdf(附下载链接)
  7. java web项目_一个完整JavaWeb项目开发总结
  8. JAVA王思聪吃热狗程序_王思聪吃热狗什么梗?
  9. php eclipse 插件下载地址,Eclipse插件-PHPEclipse插件v1.2.3 最新版下载__飞翔下载
  10. Emmagee性能测试简单的使用
  11. SHOPNC 插件机制的实现记录
  12. 文本转思维导图(xmind)
  13. MySQL binlog存储格式笔记
  14. 创新易死需要勇气 需要抵御“抄袭”心魔
  15. [Offer收割]编程练习赛2 hihocoder 1272 买零食 (DFS 或 dp 水题)
  16. PGM:有向图模型:贝叶斯网络
  17. Powerdesigner逆向工程从sql server数据库生成pdm
  18. 快嘴阿里旺旺超强营销王 2007 绿色
  19. 支付宝APP支付申请
  20. emui11是鸿蒙过渡,透过EMUI11看鸿蒙OS 将延续三大原则

热门文章

  1. [uni-app]h5+app页面背景图全屏显示
  2. word制作多个单位联合发文的文件头
  3. Rasa开发使用 Rasa_NLU及Rasa_Core模型训练与测试
  4. UE5实现PS图层样式投影效果
  5. 再见了,我的黄色文件夹(内置福利)
  6. matlab——整数规划
  7. html 页面数据显示不全,解决了一个Web网页显示不全的BUG
  8. 管理系统中计算机应用VIF,vif第1章课件.ppt
  9. JAVA身份证阅读器数据返回图片
  10. windows计算机锁屏的快捷键是什么,win7的锁屏快捷键是什么 win7锁屏快捷键介绍【图文】...