item的使用以及SQLite數據庫增刪改查

前言

該程序有兩個版本,1是實現item使用,以及界面的增刪;2增加了SQLite數據庫的使用,可以保存數據。

一、主要知識點

1.item佈局

主要運用ListView

    <ListView
        android:id="@+id/accountLV"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below = "@+id/addLL">
    </ListView>

2.BaseAdapter數據適配器

首先要繼承BaseAdapter,實現下面代碼中的四個函數

class MyBaseAdapter extends BaseAdapter{
        public int getCount(){
            return list.size();
        }
        public Object getItem(int position){
            return list.get(position);
        }
        public long getItemId(int position){
            return position;
        }
        //得到需要返回的條目
        public View getView(int position, View convertView, ViewGroup parent){
            return item;
        }
    }

運用

//定義
private MyBaseAdapter adapter;
//初始化
adapter = new MyBaseAdapter();
//ListView類運用
ListView accountLV.setAdapter(adapter);

更詳細參考博文:http://www.cnblogs.com/mandroid/archive/2011/04/05/2005525.html

3.ListView的setSelection函數

一般來說,listview的數據是按輸入順序存放的,
這個函數的目的是輸入後把光標移動到你輸入的一行listview。
例如你的屏幕能放下10條數據,當你輸入11條數據後,你將能看到第11條數據

例如輸入商品名稱:毛巾 金額:5

這裏寫圖片描述

運用setSelection函數後顯示

這裏寫圖片描述

不運用setSelection函數後顯示

這裏寫圖片描述

4.List集合類

要記得實例化。

5.adapter.notifyDataSetChanged函數

刷新數據,重新調用BaseAdapter類的getView函數。

6.setOnItemClickListener(暫時沒有領會用途)

7.SQLite數據庫的使用

(1)繼承SQLiteOpenHelper完成數據庫表的創建
(2)創建數據庫操作類。

在操作類中定義數據庫

//shujuku是我繼承SQLiteOpenHelper的類名
private shujuku helper;    
public AccountDao(Context context){
    helper = new shujuku(context);
}

    //插入數據
    public void insert(Account account){
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name",account.getName());
        values.put("balance",account.getBalance());
        long id = db.insert("account",null,values);
        account.setId(id);
        db.close();
    }

    //刪除數據
    public int delete(long id){
        SQLiteDatabase db = helper.getWritableDatabase();
        int count = db.delete("account","_id=?",new String[]{id+""});
        db.close();
        return count;
    }

    //更新數據
    public int update(Account account){
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name",account.getName());
        values.put("balance",account.getBalance());
        int count = db.update("account",values,"_id = ?",new String[]{account.getId()+""});
        db.close();
        return count;
    }

    //查詢所有數據的倒序排列
    public List<Account> queryAll(){
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor c = db.query("account",null,null,null,null,null,"balance DESC");
        List<Account> list = new ArrayList<Account>();
        while (c.moveToNext()){
            long id = c.getLong(c.getColumnIndex("_id"));
            String name = c.getString(1);
            int balance = c.getInt(2);
            list.add(new Account(id,name,balance));
        }
        c.close();
        db.close();
        return list;
    }

8.ContentValues類

  //ContentValues 和HashTable類似都是一種存儲的機制 但是兩者最大的區別就在於,
    // contenvalues只能存儲基本類型的數據,像string,int之類的,不能存儲對象這種東西,而HashTable卻可以存儲對象。
    //在忘數據庫中插入數據的時候,首先應該有一個ContentValues的對象所以:
    //ContentValues initialValues = new ContentValues();
    //initialValues.put(key,values);
    // SQLiteDataBase sdb ;
    // sdb.insert(database_name,null,initialValues);
    //插入成功就返回記錄的id否則返回-1;

9.SQLiteDatabase中的query

    //public  SQLiteDatabase   query  (String table, String[] columns, String selection, String[] selectionArgs,
    //String groupBy, String having, String orderBy, String limit)

這裏寫圖片描述

二、犯下的錯誤

1.佈局沒有做好,導致遮擋。
2.沒有認清錯誤的方向,花費了做錯誤的時間,因禍得福,對程序有了更一步的瞭解。
3.app下載到手機後,打開閃退。原因是定義了list沒有實例化,在後續運用了list。

三、原碼

1.兩個版本相同的xml文件

(1)主界面:

這裏寫圖片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_margin="8dp"
    tools:context="com.myapplication.MainActivity">
    <LinearLayout
        android:id="@+id/addLL"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/nameET"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="商品名稱"
            android:inputType="textPersonName"/>
        <EditText
            android:id="@+id/balanceET"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="金額"
            android:inputType="number"/>
        <Button
            android:id="@+id/addIV"
            android:text="增加商品"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    <ListView
        android:id="@+id/accountLV"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below = "@+id/addLL">
    </ListView>



</LinearLayout>

(2)item:

這裏寫圖片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="10dp">
    <TextView
        android:id="@+id/idTV"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="13"
        android:textColor="#000000"
        android:textSize="20sp" />
    <TextView
        android:id="@+id/nameTV"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:singleLine="true"
        android:text="PQ"
        android:textColor="#000000"
        android:textSize="20sp" />
    <TextView
        android:id="@+id/balanceTV"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="12345"
        android:textColor="#000000"
        android:textSize="20sp" />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <Button
            android:id="@+id/upIV"
            android:layout_width="25sp"
            android:layout_height="15sp"
            android:text="增加金額"
            android:layout_marginBottom="2dp"/>
        <Button
            android:id="@+id/downIV"
            android:layout_width="25sp"
            android:layout_height="15sp"
            android:text="減少金額"
            android:layout_marginBottom="2dp"/>
    </LinearLayout>
    <Button
        android:id="@+id/deleteIV"
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:text="刪除數據"/>
</LinearLayout>

2.代碼

(1)沒有數據庫版本

MainActivity

package com.myapplication;

import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private EditText nameET;
    private EditText balanceET;
    private Button addIV;
    private ListView accountLV;
    private MyBaseAdapter adapter;
    private List<Account> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nameET  = (EditText)findViewById(R.id.nameET);
        balanceET = (EditText)findViewById(R.id.balanceET);
        addIV = (Button) findViewById(R.id.addIV);
        accountLV = (ListView) findViewById(R.id.accountLV);
        accountLV.setOnItemClickListener(new MyOnItemClickListener());

        adapter = new MyBaseAdapter();
        accountLV.setAdapter(adapter);

        addIV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String name = nameET.getText().toString().trim();
                String balance = balanceET.getText().toString().trim();
                Account a = new Account(name,balance.equals("")?0:Integer.parseInt(balance));
                list.add(a);

                adapter.notifyDataSetChanged();//刷新界面
                //一般來說,listview的數據是按輸入順序存放的,
                // 這個函數的目的是輸入後把光標移動到你輸入的一行listview
                accountLV.setSelection(accountLV.getCount()-1);
                nameET.setText("");
                balanceET.setText("");
            }
        });
    }
    class MyBaseAdapter extends BaseAdapter{
        public int getCount(){
            return list.size();
        }
        public Object getItem(int position){
            return list.get(position);
        }
        public long getItemId(int position){
            return position;
        }
        //因此如果你的Activity裏如果用到別的layout,比如對話框上的layout,
        // 你還要設置對話框上的layout裏的組件(像圖片ImageView,文字TextView)上的內容,
        // 你就必須用inflate()先將對話框上的layout找出來,然後再用這個layout對象去找到它上面的組件
        public View getView(int position, View convertView, ViewGroup parent){
            View item = convertView!=null?convertView:View.inflate(getApplicationContext(),R.layout.item,null);

            TextView idTV =(TextView) item.findViewById(R.id.idTV);
            TextView nameTV =(TextView) item.findViewById(R.id.nameTV);
            TextView balanceTV =(TextView) item.findViewById(R.id.balanceTV);

            final Account a = list.get(position);

            idTV.setText(a.getId()+"");
            nameTV.setText(a.getName());
            //nameTV.setText(names[position]);
            balanceTV.setText(a.getBalance()+"");

            Button upIV = (Button) item.findViewById(R.id.upIV);
            Button downIV = (Button) item.findViewById(R.id.downIV);
            Button deleteIV = (Button) item.findViewById(R.id.deleteIV);

            upIV.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    a.setBalance(a.getBalance()+1);
                    notifyDataSetChanged();
                }
            });

            downIV.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    a.setBalance(a.getBalance()-1);
                    notifyDataSetChanged();
                }
            });

            deleteIV.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    android.content.DialogInterface.OnClickListener listener = new android.content.DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface dialog, int which){
                            list.remove(a);
                            notifyDataSetChanged();
                        }
                    };
                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                    builder.setTitle("確定要刪除嗎?");
                    builder.setPositiveButton("確定",listener);
                    builder.setNegativeButton("取消",null);
                    builder.show();
                }
            });

            return item;
        }
    }
    private class  MyOnItemClickListener implements AdapterView.OnItemClickListener {
        public void onItemClick(AdapterView<?> parent,View view,int position,long id){
            Account a = (Account) parent.getItemAtPosition(position);
            Toast.makeText(getApplicationContext(),a.toString(),Toast.LENGTH_SHORT).show();
        }
    }
}

數據類Account

package com.myapplication;

/**
 * Created by 鍾鍾 on 2017-05-06.
 */

public class Account {
    private Long id;
    private String name;
    private Integer balance;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getBalance() {
        return balance;
    }

    public void setBalance(Integer balance) {
        this.balance = balance;
    }
    public Account(Long id,String name,Integer balance){
        super();
        this.id = id;
        this.name = name;
        this.balance = balance;
    }
    public Account(String name,Integer balance){
        super();
        this.name = name;
        this.balance = balance;
    }
    public Account(){
        super();
    }
    public String toString(){
        return "[序號:"+id+",商品名稱:"+name+",餘額:"+balance+"]";
    }
}

(2)SQLite數據庫版本

MainActivity

package com.myapplication;

import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;
/*
public class MainActivity extends AppCompatActivity {
    private ListView mList;
    private String[] names= {"12","23","34","25","78","910","11","7","12"};
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mList = (ListView)findViewById(R.id.accountLV);

    }

    class MyBaseAdapter extends BaseAdapter{
        public int getCount(){
            return names.length;
        }
        public Object getItem(int position){
            return names[position];
        }
        public long getItemId(int position){
            return position;
        }

        @Override
        public View getView(int positon, View convertView, ViewGroup parent) {
            View view = View.inflate(MainActivity.this,R.layout.list_item,null);
            TextView m =(TextView) view.findViewById(R.id.nameTV);
            m.setText(names[positon]);
            return view;
        }
    }

}
*/


public class MainActivity extends AppCompatActivity {
    private List<Account> list;
    private AccountDao dao;
    private EditText nameET;
    private EditText balanceET;
    private MyBaseAdapter adapter;
    private ListView accountLV;
    private String[] names= {"12","23","34","25","78","910","11","7","12"};

    private class  MyOnItemClickListener implements AdapterView.OnItemClickListener {
        public void onItemClick(AdapterView<?> parent,View view,int position,long id){
            Account a = (Account) parent.getItemAtPosition(position);
            Toast.makeText(getApplicationContext(),a.toString(),Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化ListView控件
        initView();
        dao = new AccountDao(this);
        list = dao.queryAll();
        adapter = new MyBaseAdapter();
        accountLV.setAdapter(adapter);
        //accountLV.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item,R.id.accountLV),names);
    }
    public void initView(){
        accountLV = (ListView)findViewById(R.id.accountLV);
        nameET = (EditText)findViewById(R.id.nameET);
        balanceET = (EditText)findViewById(R.id.balanceET);
        //accountLV.setOnItemClickListener(new MyOnItemClickListener());

    }
    public void add(View v){
        String name = nameET.getText().toString().trim();
        String balance = balanceET.getText().toString().trim();
        Account a = new Account(name,balance.equals("")?0:Integer.parseInt(balance));
        dao.insert(a);
        list.add(a);
        adapter.notifyDataSetChanged();
        accountLV.setSelection(accountLV.getCount()-1);
        nameET.setText("");
        balanceET.setText("");

    }
    //類繼承BaseAdapter
    //BaseAdapter就Android應用程序中經常用到的基礎數據適配器,
    // 它的主要用途是將一組數據傳到像ListView、Spinner、Gallery及GridView等UI顯示組件,它是繼承自接口類Adapter,
    class MyBaseAdapter extends BaseAdapter{
        public int getCount(){
            return list.size();
        }
        public Object getItem(int position){

            return list.get(position);
        }
        public long getItemId(int position){

            return position;
        }
        //因此如果你的Activity裏如果用到別的layout,比如對話框上的layout,
        // 你還要設置對話框上的layout裏的組件(像圖片ImageView,文字TextView)上的內容,
        // 你就必須用inflate()先將對話框上的layout找出來,然後再用這個layout對象去找到它上面的組件
        public View getView(int position, View convertView, ViewGroup parent){
            View item = convertView!=null?convertView:View.inflate(getApplicationContext(),R.layout.list_item,null);

            TextView idTV =(TextView) item.findViewById(R.id.idTV);
            TextView nameTV =(TextView) item.findViewById(R.id.nameTV);
            TextView balanceTV =(TextView) item.findViewById(R.id.balanceTV);

            final Account a = list.get(position);

            idTV.setText(a.getId()+"");
            nameTV.setText(a.getName());
            //nameTV.setText(names[position]);
            balanceTV.setText(a.getBalance()+"");

            Button upIV = (Button) item.findViewById(R.id.upIV);
            Button downIV = (Button) item.findViewById(R.id.downIV);
            Button deleteIV = (Button) item.findViewById(R.id.deleteIV);

            upIV.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    a.setBalance(a.getBalance()+1);
                    notifyDataSetChanged();
                    dao.update(a);
                }
            });

            downIV.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    a.setBalance(a.getBalance()-1);
                    notifyDataSetChanged();
                    dao.update(a);
                }
            });

            deleteIV.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    android.content.DialogInterface.OnClickListener listener = new android.content.DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface dialog,int which){
                            list.remove(a);
                            dao.delete(a.getId());
                            notifyDataSetChanged();
                        }
                    };

                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                    builder.setTitle("確定要刪除嗎?");
                    builder.setPositiveButton("確定",listener);
                    builder.setNegativeButton("取消",null);
                    builder.show();
                }
            });

            return item;
        }
    }

}

數據庫類

package com.myapplication;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by 鍾鍾 on 2017-05-05.
 */

public class shujuku  extends SQLiteOpenHelper{
    public shujuku(Context context){

        super(context,"itcast.db",null,2);
    }
    public void onCreate(SQLiteDatabase db){
        db.execSQL("create table account(_id integer primary key autoincrement,"+"name varchar(20),"+"balance integer)");
    }
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        System.out.println("onUpgrade");
    }

}

數據庫操作類(增刪改查)

package com.myapplication;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by 鍾鍾 on 2017-05-05.
 */

public class AccountDao {
    private shujuku helper;
    public AccountDao(Context context){
        helper = new shujuku(context);
    }
    //插入數據
    public void insert(Account account){
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name",account.getName());
        values.put("balance",account.getBalance());
        long id = db.insert("account",null,values);
        account.setId(id);
        db.close();

    }
    //刪除數據
    public int delete(long id){
        SQLiteDatabase db = helper.getWritableDatabase();
        int count = db.delete("account","_id=?",new String[]{id+""});
        db.close();
        return count;
    }
    //更新數據
    public int update(Account account){
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name",account.getName());
        values.put("balance",account.getBalance());
        int count = db.update("account",values,"_id = ?",new String[]{account.getId()+""});
        db.close();
        return count;
    }
    //查詢所有數據的倒序排列
    public List<Account> queryAll(){
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor c = db.query("account",null,null,null,null,null,"balance DESC");
        List<Account> list = new ArrayList<Account>();
        while (c.moveToNext()){
            long id = c.getLong(c.getColumnIndex("_id"));
            String name = c.getString(1);
            int balance = c.getInt(2);
            list.add(new Account(id,name,balance));
        }
        c.close();
        db.close();
        return list;
    }
}

數據類Account同上

發佈了26 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章