Android Sqlite 练手demo

这是一个商品添加到购物车的小demo,有登录注册,商品列表,添加购物车,移除购物车等功能,基于Sqlite实现对数据的增删改查。

下面是代码解读,适合新手阅读学习:

1.页面包含两个文本输入框,用来输入用户名和密码,一个登录按钮,一个注册按钮。

2.点击登录则验证用户名密码输入是否为空,为空则给出提示,不为空则根据输入的用户名和密码查询数据库,根据查询结果判断是否存在该用户;若存在则将当前用户名、性别信息存储在SharedPreferences中,以便在我的页面查看,然后跳转到首页,并将当前用户名通过Intent传值到首页,在跳转到首页时,提示”欢迎xx登录”,若不存在则给出提示:用户名或密码错误

List<userbean> list = SQLiteDbUtil.getSQLiteDbUtil().query(UserBean.class,"name=? and pwd=?",new String[]{name,pwd});
if (list == null || list.size() == 0){
&#xA0;&#xA0;&#xA0;&#xA0;Toast.makeText(this, "&#x7528;&#x6237;&#x540D;&#x6216;&#x5BC6;&#x7801;&#x9519;&#x8BEF;", Toast.LENGTH_LONG).show();
&#xA0;&#xA0;&#xA0;&#xA0;return;
}
UserBean user = list.get(0);
//&#x5B58;&#x5230;SharedPreferences&#x5DE5;&#x5177;&#x7C7B;
SPUtil.saveString(this,"name",name);
SPUtil.saveString(this,"sexName",user.getSexName());</userbean>

3.点击注册跳转到注册页面。

1.页面包含两个文本输入框,用户输入用户名和密码,一个spinner下拉,用来选择性别,性别默认为空,一个注册按钮

2.为spinner设置数据源和适配器,以及选中事件,选中时重新标记mSexName变量,mSexName是性别名称变量,值为男或女,默认是男

String[] sexItems = new String[]{"&#x7537;", "&#x5973;"};
mSexName = sexItems[0];
ArrayAdapter<string> spinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, sexItems);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinnerAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
&#xA0;&#xA0;&#xA0;&#xA0;@Override
&#xA0;&#xA0;&#xA0;&#xA0;public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;mSexName = sexItems[position];
&#xA0;&#xA0;&#xA0;&#xA0;}

&#xA0;&#xA0;&#xA0;&#xA0;@Override
&#xA0;&#xA0;&#xA0;&#xA0;public void onNothingSelected(AdapterView<?> parent) {

&#xA0;&#xA0;&#xA0;&#xA0;}
});</string>

3.点击注册时,判断用户名和密码输入是否为空,为空则给出提示,不为空则新增一条User记录,插入到数据库,插入之前先判断输入的用户名是否已经存在了,若存在则提示用户名已被注册

List<userbean> list = SQLiteDbUtil.getSQLiteDbUtil().query(UserBean.class,"name=?",new String[]{name});
if (list != null && list.size() > 0){
&#xA0;&#xA0;&#xA0;&#xA0;Toast.makeText(this, "&#x8BE5;&#x7528;&#x6237;&#x540D;&#x5DF2;&#x88AB;&#x6CE8;&#x518C;", Toast.LENGTH_LONG).show();
&#xA0;&#xA0;&#xA0;&#xA0;return;
}
UserBean user = new UserBean(name,pwd,mSexName);
SQLiteDbUtil.getSQLiteDbUtil().insert(user);</userbean>

4.插入成功后,关闭当前页面,回到登录页面进行登录

1.首页布局使用viewpager+fragment,fragment有三个,分别是商品、购物车、我的

2.为viewpager的适配器设置数据,表示将有上述三个页面会被显示到viewpager,默认显示商品页面

MyFragment myFragment = new MyFragment();
List<fragment> fragmentList = new ArrayList<>();
fragmentList.add(foodFragment);
fragmentList.add(cartFragment);
fragmentList.add(myFragment);
mFragmentAdapter.refreshUi(fragmentList);
mViewPager.setOffscreenPageLimit(fragmentList.size());</fragment>

3.商品页面展示商品列表,购物车展示已加入购物车的商品,我的展示当前登录用户信息等

4.通过getIntent取登录页面传来的name值,并提示欢迎xx登录

5.商品、购物车、我的页面切换时,通过viewpager.setCurrentItem指定

6.页面初始化时会查询数据库购物车列表,并添加到Bundle,并将Bundle通过fragment.setArguments,传递给fragment

if (list != null){
&#xA0;&#xA0;&#xA0;&#xA0;Bundle bundle = new Bundle();
&#xA0;&#xA0;&#xA0;&#xA0;bundle.putParcelableArrayList("datas", (ArrayList<? extends Parcelable>) list);
&#xA0;&#xA0;&#xA0;&#xA0;cartFragment.setArguments(bundle);
}

1.页面布局使用TabHost+ListView,其中Tab有三个,分别是美食、饮品、水果,ListView也有三个,分别展示每个tab对应的数据

以下为初始化tabHost,并为其设置tab名称,绑定对应的tab布局,每个tab都是listview,用来显示对应tab数据

mListView1 = view.findViewById(R.id.lv_food1);
mListView2 = view.findViewById(R.id.lv_food2);
mListView3 = view.findViewById(R.id.lv_food3);

mAdapter1 = new ListFoodAdapter(getActivity());
mAdapter2 = new ListFoodAdapter(getActivity());
mAdapter3 = new ListFoodAdapter(getActivity());

mListView1.setAdapter(mAdapter1);
mListView2.setAdapter(mAdapter2);
mListView3.setAdapter(mAdapter3);
TabHost tab = view.findViewById(R.id.tab);
tab.setup();
//&#x521B;&#x5EFA;Tab&#x6807;&#x7B7E;
tab.addTab(tab.newTabSpec("one").setIndicator("&#x7F8E;&#x98DF;").setContent(R.id.tab1));
tab.addTab(tab.newTabSpec("two").setIndicator("&#x996E;&#x54C1;").setContent(R.id.tab2));
tab.addTab(tab.newTabSpec("two").setIndicator("&#x6C34;&#x679C;").setContent(R.id.tab3));

2.初始化时,构造测试数据,分别是美食商品的测试数据,饮品的测试数据、水果的测试数据,每组分别有10条数据

String[] delicacy = new String[]{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;"&#x7CBE;&#x81F4;&#x4FBF;&#x5F53;","&#x771F;&#x725B;&#x94C1;&#x677F;&#x677F;","&#x516B;&#x5757;&#x516B;","&#x80AF;&#x5FB7;&#x57FA;&#x5B85;&#x6025;&#x9001;","&#x6B63;&#x65B0;&#x9E21;&#x6392;","&#x5FC5;&#x80DC;&#x5BA2;&#x5B85;&#x6025;&#x9001;","&#x9EA6;&#x5F53;&#x52B3;","&#x4E09;&#x4E2A;&#x5148;&#x68EE;&#x7684;&#x97E9;&#x56FD;&#x70B8;&#x9E21;","&#x7EDD;&#x5473;&#x9E2D;&#x8116;","&#x534E;&#x83B1;&#x58EB;"
};
String[] delicacy_price = new String[]{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;"17.7","30.8","18.0","17.7","26.9","24.9","30.0","33","19","21.3"
};
String[] drink = new String[]{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;"&#x9EC4;&#x6843;&#x679C;&#x9738;","&#x73CD;&#x73E0;&#x5976;&#x8336;","&#x6843;&#x6843;&#x6447;&#x6447;&#x5976;&#x6614;","&#x6EE1;&#x676F;&#x767E;&#x9999;&#x679C;","&#x871C;&#x6843;&#x56DB;&#x5B63;&#x6625;","&#x68D2;&#x6253;&#x9C9C;&#x6A59;","&#x67E0;&#x840C;&#x7EFF;&#x8336;","&#x67E0;&#x840C;&#x7EA2;&#x8336;","&#x68EE;&#x6797;&#x73AB;&#x679C;","&#x51B0;&#x9C9C;&#x67E0;&#x840C;&#x6C34;"
};
String[] drink_price = new String[]{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;"8.9","10.8","18.2","5","8","9","12","15","5","11"
};
String[] fruit = new String[]{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;"&#x9999;&#x8549;","&#x67E0;&#x840C;","&#x82F9;&#x679C;","&#x8349;&#x8393;","&#x897F;&#x74DC;","&#x6843;","&#x67DA;&#x5B50;","&#x68A8;","&#x54C8;&#x5BC6;&#x74DC;","&#x8461;&#x8404;"
};
String[] fruit_price = new String[]{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;"3","8.9","8","12","5","1.2","2.3","8","6","11"
};

3.为listview设置适配器,并分别设置对应的测试数据

mAdapter1.refreshUi(foodList_delicacy);
mAdapter2.refreshUi(foodList_drink);
mAdapter3.refreshUi(foodList_fruit);

4.切换tab时即可看到对应tab下的商品数据,例如点击美食,看到的就是美食列表、点击饮品看到的就是饮品列表

5.点击添加购物车,即可将当前商品添加到购物车,添加时,先查询数据库该商品是否已经添加过了,若添加过,则数量加1并更新数据库,否则新建一条购物车记录数据,添加到数据库

FoodBean _bean = (FoodBean)v.getTag();
List<cartbean> list = SQLiteDbUtil.getSQLiteDbUtil().query(CartBean.class,"name=?",new String[]{_bean.getName()});
if (list != null && list.size() == 1){//&#x5DF2;&#x6DFB;&#x52A0;&#x8FC7;&#xFF0C;&#x6539;&#x4E0B;&#x6570;&#x91CF;
&#xA0;&#xA0;&#xA0;&#xA0;CartBean cart = list.get(0);
&#xA0;&#xA0;&#xA0;&#xA0;cart.setNum(cart.getNum() + 1);
&#xA0;&#xA0;&#xA0;&#xA0;SQLiteDbUtil.getSQLiteDbUtil().update(cart,cart.getId());
}else {
&#xA0;&#xA0;&#xA0;&#xA0;CartBean cartBean = new CartBean(_bean.getName(),_bean.getPrice());
&#xA0;&#xA0;&#xA0;&#xA0;cartBean.setNum(1);
&#xA0;&#xA0;&#xA0;&#xA0;SQLiteDbUtil.getSQLiteDbUtil().insert(cartBean);
}
Toast.makeText(mContext,"&#x6DFB;&#x52A0;&#x6210;&#x529F;",Toast.LENGTH_SHORT).show();</cartbean>

1.页面布局是一个ListView,用来显示购物车列表

2.通过getArguments获取MainActivity传来的购物车列表,并设置给listview的适配器

//&#x83B7;&#x53D6;bundle&#x6570;&#x636E;
Bundle bundle = getArguments();
if (bundle != null && bundle.getParcelableArrayList("datas") != null){
&#xA0;&#xA0;&#xA0;&#xA0;List<cartbean> list = SQLiteDbUtil.getSQLiteDbUtil().query(CartBean.class);
&#xA0;&#xA0;&#xA0;&#xA0;if (list != null){
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;mAdapter.refreshUi(list);
&#xA0;&#xA0;&#xA0;&#xA0;}
}</cartbean>

3.通过setUserVisibleHint方法,判断当前页面是否正在展示,若正在展示,则查询数据库最新的购物车列表,设置给listview的适配器

//&#x53EF;&#x89C1;&#x65F6;&#x5237;&#x65B0;&#x6570;&#x636E;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
&#xA0;&#xA0;&#xA0;&#xA0;super.setUserVisibleHint(isVisibleToUser);
&#xA0;&#xA0;&#xA0;&#xA0;if (isVisibleToUser){
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;List<cartbean> list = SQLiteDbUtil.getSQLiteDbUtil().query(CartBean.class);
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;if (list != null){
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;mAdapter.refreshUi(list);
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;}
}</cartbean>

4.列表中显示商品名称,已添加的数量,并通过数量*单价求出总价,点击移除购物车,则将数量-1,减到0时,则表示完全移除购物车,每次点击移除购物车时,会有对话框提示,点击取消则取消,点击确定才会进行移除操作

new AlertDialog.Builder(mContext).setTitle("&#x79FB;&#x9664;&#x63D0;&#x793A;").setMessage("&#x786E;&#x5B9A;&#x79FB;&#x9664;&#x8D2D;&#x7269;&#x8F66;&#x5417;?")
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;.setPositiveButton("&#x786E;&#x5B9A;", new DialogInterface.OnClickListener() {
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;@Override
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;public void onClick(DialogInterface dialog, int which) {
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;CartBean _bean = (CartBean) v.getTag();
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;int _num = _bean.getNum() - 1;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;_bean.setNum(_num);
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;if (_num == 0) {
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x79FB;&#x9664;&#x5E76;&#x5237;&#x65B0;&#x9875;&#x9762;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;SQLiteDbUtil.getSQLiteDbUtil().delete(CartBean.class, _bean.getId());
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;} else {
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x66F4;&#x65B0;&#x6570;&#x636E;&#x5E93;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;SQLiteDbUtil.getSQLiteDbUtil().update(_bean, _bean.getId());
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;mDatas = SQLiteDbUtil.getSQLiteDbUtil().query(CartBean.class);
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;notifyDataSetChanged();
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}).setNegativeButton("&#x53D6;&#x6D88;", null)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;.create()
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;.show();

1.页面两个文本,分别显示当前登录用户名称已用户性别,一个退出登录按钮,点击则跳转到登录页面

2.用户名和性别,通过SharedPreferences来获取,登录时已经通过SharedPreferences做了保存,这里只要读取即可

//&#x53D6;sp&#x6570;&#x636E;
String name = SPUtil.getString(getActivity(),"name","&#x672A;&#x77E5;&#x7528;&#x6237;");
String sexName = SPUtil.getString(getActivity(),"sexName","&#x672A;&#x77E5;&#x6027;&#x522B;");
tv_name.setText(name);
tv_sex_name.setText(sexName);

SQLiteDbUtil

这是对原生SQLite的封装,支持增删改查,创建表,创建数据库等操作

SPUtil

这是对原生SharedPreferences的封装,支持字符串和数值类型的数据存储与读取

App

是程序的主入口,初始化时会创建数据库和三张表,数据库若已经存在了则不会创建,表也同理

其中FoodBean表没用到,因为用的是测试数据

UserBean是用户表,存储用户名与密码

CartBean是购物车表,存储每一条添加到购物车的数据

SQLiteDbUtil.getSQLiteDbUtil().openOrCreateDataBase(this,null);
SQLiteDbUtil.getSQLiteDbUtil().createTable(UserBean.class);
SQLiteDbUtil.getSQLiteDbUtil().createTable(FoodBean.class);
SQLiteDbUtil.getSQLiteDbUtil().createTable(CartBean.class);

Original: https://blog.csdn.net/always_and_forever_/article/details/122298755
Author: Code王工
Title: Android Sqlite 练手demo

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/815933/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球