《移动项目实践》实验报告——Android数据存储

Posted Starzkg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《移动项目实践》实验报告——Android数据存储相关的知识,希望对你有一定的参考价值。

实验目的

1、熟悉android五种主要存储方式的用法,包括共享参数SharedPreferences、数据库SQLite、SD卡文件、App的全局内存;
2、熟悉重要组件之一的应用Application的基本概念与常见用法,以及四大组件之一的内容提供器ContentProvider的基本概念与常见用法;

实验内容

“购物车”的设计与实现(参考效果图)

  1. 初始效果

  2. 手机商场的商品列表

  3. 商品详情页面

  4. 添加商品后的购物车

实验过程(实验的设计思路、关键源代码等)

源代码: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数据存储的主要内容,如果未能解决你的问题,请参考以下文章

《移动项目实践》实验报告——Android网络通信

《移动项目实践》实验报告——Android设备操作

《移动项目实践》实验报告——Android设备操作

《移动项目实践》实验报告——Android设备操作

《移动项目实践》实验报告——Android调试与上线

《移动项目实践》实验报告——Android中级控件