《移动项目实践》实验报告——Android数据存储
Posted Starzkg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《移动项目实践》实验报告——Android数据存储相关的知识,希望对你有一定的参考价值。
实验目的
1、熟悉android五种主要存储方式的用法,包括共享参数SharedPreferences、数据库SQLite、SD卡文件、App的全局内存;
2、熟悉重要组件之一的应用Application的基本概念与常见用法,以及四大组件之一的内容提供器ContentProvider的基本概念与常见用法;
实验内容
“购物车”的设计与实现(参考效果图)
-
初始效果
-
手机商场的商品列表
-
商品详情页面
-
添加商品后的购物车
实验过程(实验的设计思路、关键源代码等)
源代码:https://gitee.com/shentuzhigang/mini-project/tree/master/android-shopping
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffdd"
android:orientation="vertical" >
<include layout="@layout/activity_shopping_title" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp" >
<LinearLayout
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone" >
<LinearLayout
android:id="@+id/ll_cart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp" >
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center|right"
android:text="总金额:"
android:textColor="@color/black"
android:textSize="17sp" />
<TextView
android:id="@+id/tv_total_price"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="center|left"
android:textColor="@color/red"
android:textSize="25sp" />
<Button
android:id="@+id/btn_settle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="结算"
android:textColor="@color/black"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_empty"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="100dp"
android:layout_marginTop="100dp"
android:gravity="center"
android:text="哎呀,购物车空空如也,快去选购商品吧"
android:textColor="@color/black"
android:textSize="17sp" />
<Button
android:id="@+id/btn_shopping_channel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="逛逛手机商场"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout>
</FrameLayout>
</ScrollView>
</LinearLayout>
package io.shentuzhigang.demo.shopping
import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlertDialog
import android.content.Intent
import android.graphics.BitmapFactory
import android.graphics.Color
import android.os.Bundle
import android.os.Environment
import android.util.Log
import android.util.TypedValue
import android.view.*
import android.view.ContextMenu.ContextMenuInfo
import android.widget.ImageView
import android.widget.ImageView.ScaleType
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import io.shentuzhigang.demo.shopping.MainApplication
import io.shentuzhigang.demo.shopping.bean.CartInfo
import io.shentuzhigang.demo.shopping.bean.GoodsInfo
import io.shentuzhigang.demo.shopping.database.CartDBHelper
import io.shentuzhigang.demo.shopping.database.GoodsDBHelper
import io.shentuzhigang.demo.shopping.util.FileUtil
import io.shentuzhigang.demo.shopping.util.SharedUtil
import java.util.*
/**
* Created by ouyangshen on 2017/10/1.
*/
@SuppressLint("SetTextI18n")
class ShoppingCartActivity : Activity(), View.OnClickListener {
private lateinit var iv_menu: ImageView
private lateinit var tv_count: TextView
private lateinit var tv_total_price: TextView
private lateinit var ll_content: LinearLayout
private lateinit var ll_cart: LinearLayout
private lateinit var ll_empty: LinearLayout
private var mCount // 购物车中的商品数量
= 0
private var mGoodsHelper // 声明一个商品数据库的帮助器对象
: GoodsDBHelper? = null
private var mCartHelper // 声明一个购物车数据库的帮助器对象
: CartDBHelper? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.activity_shopping_cart)
iv_menu = findViewById(R.id.iv_menu)
val tv_title = findViewById<TextView>(R.id.tv_title)
tv_count = findViewById(R.id.tv_count)
tv_total_price = findViewById(R.id.tv_total_price)
ll_content = findViewById(R.id.ll_content)
ll_cart = findViewById(R.id.ll_cart)
ll_empty = findViewById(R.id.ll_empty)
iv_menu.setOnClickListener(this)
findViewById<View>(R.id.btn_shopping_channel).setOnClickListener(this)
findViewById<View>(R.id.btn_settle).setOnClickListener(this)
iv_menu.setVisibility(View.VISIBLE)
tv_title.text = "购物车"
}
// 显示购物车图标中的商品数量
private fun showCount(count: Int) {
mCount = count
tv_count!!.text = "" + mCount
if (mCount == 0) {
ll_content!!.visibility = View.GONE
ll_cart!!.removeAllViews()
ll_empty!!.visibility = View.VISIBLE
} else {
ll_content!!.visibility = View.VISIBLE
ll_empty!!.visibility = View.GONE
}
}
override fun onClick(v: View) {
if (v.id == R.id.iv_menu) { // 点击了菜单图标
openOptionsMenu()
} else if (v.id == R.id.btn_shopping_channel) { // 点击了“商场”按钮
// 跳转到手机商场页面
val intent = Intent(this, ShoppingChannelActivity::class.java)
startActivity(intent)
} else if (v.id == R.id.btn_settle) { // 点击了“结算”按钮
val builder = AlertDialog.Builder(this)
builder.setTitle("结算商品")
builder.setMessage("客官抱歉,支付功能尚未开通,请下次再来")
builder.setPositiveButton("我知道了", null)
builder.create().show()
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// 从menu_cart.xml中构建菜单界面布局
menuInflater.inflate(R.menu.menu_cart, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == R.id.menu_shopping) { // 点击了菜单项“去商场购物”
// 跳转到商场页面
val intent = Intent(this, ShoppingChannelActivity::class.java)
startActivity(intent)
} else if (id == R.id.menu_clear) { // 点击了菜单项“清空购物车”
// 清空购物车数据库
mCartHelper!!.deleteAll()
ll_cart!!.removeAllViews()
// 把最新的商品数量写入共享参数
SharedUtil.Companion.getIntance(this)!!.writeShared("count", "0")
// 显示最新的商品数量
showCount(0)
mCartGoods.clear()
mGoodsMap.clear()
Toast.makeText(this, "购物车已清空", Toast.LENGTH_SHORT).show()
} else if (id == R.id.menu_return) { // 点击了菜单项“返回”
finish()
}
return true
}
// 声明一个根据视图编号查找商品信息的映射
private val mCartGoods: HashMap<Int, CartInfo> = HashMap<Int, CartInfo>()
// 声明一个触发上下文菜单的视图对象
private var mContextView: View? = null
override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenuInfo) {
// 保存该商品行的视图,以便删除商品时一块从列表移除该行
mContextView = v
// 从menu_goods.xml中构建菜单界面布局
menuInflater.inflate(R.menu.menu_goods, menu)
}
override fun onContextItemSelected(item: MenuItem): Boolean {
val info: CartInfo? = mCartGoods[mContextView!!.id]
val id = item.itemId
if (id == R.id.menu_detail) { // 点击了菜单项“查看商品详情”
// 跳转到查看商品详情页面
goDetail(info!!.goods_id)
} else if (id == R.id.menu_delete) { // 点击了菜单项“从购物车删除”
val goods_id: Long = info!!.goods_id
// 从购物车删除商品的数据库操作
mCartHelper!!.delete("goods_id=$goods_id")
// 从购物车列表中删除该商品行
ll_cart!!.removeView(mContextView)
// 更新购物车中的商品数量
var left_count: Int = mCount - info!!.count
for (i in mCartArray!!.indices) {
if (goods_id == mCartArray!![i].goods_id) {
left_count = mCount - mCartArray!![i].count
mCartArray!!.removeAt(i)
break
}
}
// 把最新的商品数量写入共享参数
SharedUtil.Companion.getIntance(this)!!.writeShared("count", "" + left_count)
// 显示最新的商品数量
showCount(left_count)
Toast.makeText(this, "已从购物车删除" + mGoodsMap[goods_id]!!.name, Toast.LENGTH_SHORT).show()
mGoodsMap.remove(goods_id)
refreshTotalPrice()
}
return true
}
// 跳转到商品详情页面
private fun goDetail(rowid: Long) {
val intent = Intent(this, ShoppingDetailActivity::class.java)
intent.putExtra("goods_id", rowid)
startActivity(intent)
}
override fun onResume() {
super.onResume()
// 获取共享参数保存的购物车中的商品数量
mCount = SharedUtil.Companion.getIntance(this)!!.readShared("count", "0")!!.toInt()
showCount(mCount)
// 获取商品数据库的帮助器对象
mGoodsHelper = GoodsDBHelper.Companion.getInstance(this, 1)
// 打开商品数据库的写连接
mGoodsHelper!!.openWriteLink()
// 获取购物车数据库的帮助器对象
mCartHelper = CartDBHelper.Companion.getInstance(this, 1)
// 打开购物车数据库的写连接
mCartHelper!!.openWriteLink()
// 模拟从网络下载商品图片
downloadGoods()
// 展示购物车中的商品列表
showCart()
}
override fun onPause() {
super.onPause()
// 关闭商品数据库的数据库连接
mGoodsHelper!!.closeLink()
// 关闭购物车数据库的数据库连接
mCartHelper!!.closeLink以上是关于《移动项目实践》实验报告——Android数据存储的主要内容,如果未能解决你的问题,请参考以下文章