实验二 Android数据存储实例-通讯录
一、实验目的
(1)熟练UI界面设计流程及方法;
(2)进一步掌握SQLite数据库的建立和操作方法;
(3)熟练Andriod数据库编程。
二、实验环境
(1) 硬件:PC 机,其它相关硬件 ;
(2)软件:Windows XP,Android Studio集成开发环境,Android Development Tools插件。
三、实验内容及 要求
(1)掌握界面布局;
(2)熟练SQLite数据库的创建与操作编程;
(3)熟练ListView控件的使用;
(4)完成手机通讯录的编程设计与调试。
四、实验步骤
本次实验我们将在Android上完成一个通讯录的功能。首先我们将确定要实现的这个通讯录有什么样的功能,比如:浏览联系人、添加联系人、删除联系人、编辑联系人、查看联系人,当找到一个联系人之后,可以呼叫或者发送短信息给该联系人。确定了这些功能之后,再来思考需要使用哪些知识,比如:要存储很多联系人,可以使用数据库,以方便管理和维护。在确定之后,就可以开始新建工程了。
1、UI设计
在设计界面时,需要根据所定的功能来设计,本节中我们浏览联系人是通过一个List来展示给用户的,如图1所示;用户需要操作,所以需要设计供用户操作的选项,如添加、查询等,图2和图3分别是长按联系人的菜单和直接点击联系人的效果。
在完成了这些基本功能的设计之后,需要设计添加和修改联系人的界面。这样的布局很简单,可以通过TextView来显示一个标签,比如:姓名、电话等。既然要编辑肯定需要接收用户的输入,所以这里使用了EditText来供用户输入信息,如图3所示;在修改之后可以在当前界面查看联系人的信息,如图4所示。
2、数据库设计
对于联系人信息的存储,可以使用Android中提供的数据库。要设计数据库,首先要确定数据都是什么内容,为了方便管理、维护和共享,首先将数据库中要使用的数据全部定义到DBdao类,该例中定义的数据信息在文件DBdao.java中;其中联系人信息数据封装到Person类中,其代码清单如下所示。
//定义数据
public class Person implements Serializable {
private String DEFAULT="No record";
/*姓名*/
private String name;
/*联系电话*/
private String tel;
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
if (addr.trim().length()==0){
this.addr=DEFAULT;
}
this.addr = addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
if (email.trim().length()==0){
this.email=DEFAULT;
}else {
this.email = email;
}
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
//如果空串,设为默认
if (remarks.trim().length()==0) {
this.remarks=DEFAULT;
}else {
this.remarks = remarks;
}
}
public void setHeadPickture(Bitmap headPickture) {
this.headPickture = headPickture;
}
/*住址*/
private String addr;
/*电子邮件*/
private String email;
/*备注*/
private String remarks;
/*头像*/
private Bitmap headPickture;
}
Android中的android.database.sqlite.SQLiteOpenHelper类是一个专门用于数据库创建和版本管理的辅助类。因此,为了更好地管理数据库,这里我们创建一个继承自SQLiteOpenHelper的辅助类DBdao来维护和更新数据库,并实现数据库的增、删、查、改操作,其代码清单下所示。
/* 提供数据库的 增 删 改 查 四种方法*/
public class DBdao extends SQLiteOpenHelper{
private static final String DB_NAME ="TXL.db";
private static final String TABLE_NAME = "person";
private static int DB_VERSION =1;
private SQLiteDatabase db;
private Context context;
/*全局persons容器*/
public static final List<Person> persons = new ArrayList<Person>();
/*构建表结构,初始化表*/
private static final String CREATETABLE="create table if not exists person(" +
"tel text primary key not null,"+
"name text,"+
"addr text, "+
"email text ,"+
"remarks text)";
public DBdao(Context context) {
super(context,DB_NAME,null,DB_VERSION);
this.context = context;
db = getWritableDatabase();//建立数据库
}
//打开SQLite数据库连接
public SQLiteDatabase openConnection(){
db = getWritableDatabase();
return db;
}
//关闭数据库连接,只有一个连接在外面
public void closeConnection(){
db.close();
}
//创建表
public boolean creatTable(String createTableSql){
try {
openConnection();
db.execSQL(createTableSql);
}catch (Exception e){
e.printStackTrace();
return false;
}finally {
closeConnection();
}
return true;
}
//添加数据
public boolean save(Person person/*String tableName,ContentValues context*/){
String tableName=TABLE_NAME;
ContentValues context=new ContentValues();
context.put("name",person.getName().trim());
context.put("tel",person.getTel().trim());
context.put("addr",person.getAddr().trim());
context.put("email",person.getEmail().trim());
context.put("remarks",person.getRemarks().trim());
try {
openConnection();
db.insert(tableName,null,context);
}catch (Exception e){
e.printStackTrace();
return false;
}finally {
closeConnection();
}
return true;
}
//修改数据
public boolean update(Person p){
/*String tableName,ContentValues contentValues,String whereClause,String []whereArgs*/
ContentValues contentValues = new ContentValues();
contentValues.put("name"/*表的字段名*/,p.getName().trim()/*该字段对应的值*/);
contentValues.put("tel",p.getTel().trim());
contentValues.put("addr",p.getAddr().trim());
contentValues.put("email",p.getEmail().trim());
contentValues.put("remarks",p.getRemarks().trim());
/*
* 问号出现的次序和String[]表中下标一一对应,从0开始
* 例如:
* 第一个问号,对应String[]中下标为 0 的元素
* 第二个问号,对应String[]中下标为 1 的元素
* */
String whereClause = "name=?";
String []whereArgs=new String[]{
p.getName().trim()};
try {
openConnection();
db.update(TABLE_NAME,contentValues,whereClause,whereArgs);
}catch (Exception e){
e.printStackTrace();
return false;
}finally {
closeConnection();
}
return true;
}
//删除数据
public boolean delete(String condition){
String[] obj=new String[]{
condition};
String delSql="tel=?";