开发一个购物车,将购物车中的商品以列表的形式进行显示,并且还要对购物车中的商品进行增删改查操作,运用ListView和SQLite数据库。
(1)、只给出主要代码,界面设计不再给出。
(2)、创建数据库:
新建MyHelper类继承自SQLiteOpenHelper,SQLiteOpenHelper是一个抽象类,他有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类中重写这两个方法,在这两个方法中去实现创建、升级数据库的逻辑。
public class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context) {
super(context,"itcast.db",null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("onCreate");
db.execSQL("CREATE TABLE account(_id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(20),//商品名称列
balance INTEGER)");//金额列
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("onUpgrade");
}
}
SQLiteOpenHelper中还有两个非常重要的实例方法:getReadableDatabase()和getWritableDatabase()。这两个方法都可
以创建或打开一个现有的数据库(如果数据库已经存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读
写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满),getReadableDatabase()方法返回的对象将以只读的
方式打开数据库,而getWritableDatabase()方法则将出现异常。
同时,SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数较少的构造方法即可。这个构造方法接收四个参数,第
一个是Context,必须有他才能对数据库进行操作;第二个是数据库名,创建数据库时使用的就是这里指定的名称;第三是允许我们
在查询数据时返回一个自定义的Cursor,一般传入null;第四个参数表示当前数据库的版本号,可用于对数据库进行更新操作。构建
处SQLiteOpenHelper的实例后,再调用他的getReadableDatabase()或getWritableDatabase()就能够创建数据库了。
(3)、创建Account类
在操作数据库时将数据存放至一个JavaBean对象中操作起来会比较方便。
public class Account {
private Long id;
private String name;
private int balance;
public Account(Long id, int balance, String name) {
this.id = id;
this.balance = balance;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getBalance() {
return balance;
}
public void setBalance(Integer balance) {
this.balance = balance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Account(int i, String name){
super();
}
public String toString(){
return "{序号:"+id+",商品名称:"+name+",余额:"+balance+"}";
}
}
(4)、创建数据操作逻辑类
前面创建好数据库和JavaBean后,创建一个AccountDao类用于操作数据。
public class AccountDao {
private MyHelper helper;
public AccountDao(Context context){
helper = new MyHelper(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();
}
//根据Id删除数据
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
SQLiteDatabase db = helper.getReadableDatabase();
Cursor c = db.query("account",null,null,null,null,null,"balance DESC");
List
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,balance,name));
}
c.close();
db.close();
return list;
}
}
在上面代码的insert()方法中调用了db.insert()方法,这个方法第二个参数如果传入的是null,是无法插入一条空数据的。如果想插一条空入数据,第二个参数必须写一个列名(任意列),传入的这个列名是用来拼接SQL语句的。
(5)、编写界面交互代码
public class MainActivity extends Activity {
private List
private AccountDao dao;
private EditText nameET;
private EditText priceET;
private MyAdapter adapter;
private ListView accountLV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
dao = new AccountDao(this);
list = dao.queryAll();
adapter = new MyAdapter();
accountLV.setAdapter(adapter);
}
private void initView() {
accountLV = (ListView) findViewById(R.id.shopList);
nameET = (EditText) findViewById(R.id.shopName);
priceET = (EditText) findViewById(R.id.shopPrice);
accountLV.setOnItemClickListener(new MyOnItemClickListener());
}
public void add(View v){
String name = nameET.getText().toString().trim();
String balance = priceET.getText().toString().trim();
Account a = new Account(balance.equals("")?0
:Integer.parseInt(balance),name);
dao.insert(a);
list.add(a);
adapter.notifyDataSetChanged();
accountLV.setSelection(accountLV.getCount()-1);
nameET.setText("");
priceET.setText("");
}
private class MyAdapter extends BaseAdapter {
private List
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
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) findViewById(R.id.nameTV);
TextView priceTV = (TextView) findViewById(R.id.priceTV);
final Account a = list.get(position);
idTV.setText(a.getId()+"");
nameTV.setText(a.getName());
priceTV.setText(a.getBalance()+"");
ImageView upIV = (ImageView) item.findViewById(R.id.upIV);
ImageView downIV = (ImageView) item.findViewById(R.id.downTV);
ImageView deleteIV = (ImageView) item.findViewById(R.id.deleteTV);
//向上箭头的点击事件
upIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
a.setBalance(a.getBalance()+1);
notifyDataSetChanged();
dao.update(a);
}
});
//向下箭头的点击事件
downIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
a.setBalance(a.getBalance()-1);
notifyDataSetChanged();
dao.update(a);
}
});
//删除图片的点击事件
deleteIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
android.content.DialogInterface.OnClickListener listener =
new android.content.DialogInterface.OnClickListener(){
@Override
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.setPositiveButton("取消",listener);
builder.show();
}
});
return item;
}
}
private class MyOnItemClickListener implements AdapterView.OnItemClickListener{
@Override
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();
}
}
}
上述代码中ListView的setOnItemClickListener()方法用于监听Item的点击事件,在使用该方法时需要传入一个OnItemClickListener的实现类对象,并且需要实现onItemClick方法。当点击ListView的Item时就会触发Item的点击事件然后会回调onItemClick()方法.