一、项目概述
本次项目主要实现了联系人信息(姓名和电话)的增加、删除、修改和查询功能。主要用到SQLiteDatabase来存储数据,SQLite数据库和其他的SQL数据库不同, 我们并不需要在手机上另外安装一个数据库软件,Android系统已经集成了这个数据库。我们下面会详细介绍SQLite数据库。
二、开发环境
开发环境还是老样子哈,JDK选择1.8版本,API选28,Android Studio版本最好是3.6.1。
三、详细设计
1、界面的搭建
整体布局是线性布局LinearLayout。我设置了页边距:android:padding=“10dp”,orientation方向选择的也是vertical垂直方式。下面先是放置了一个小的LinearLayout,里面是一个文本框和一个输入框,代表姓名。紧接着再放一个LinearLayout,里面也是一个文本框加一个输入框,表示电话号码。这是每个项目都常见的基本设计了。代码如下:
<LinearLayout
android:layout_marginTop="130dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓 名:"
android:textSize="28sp"/>
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入姓名"
android:textSize="26sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电 话:"
android:textSize="28sp"/>
<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入电话号码"
android:textSize="26sp"/>
</LinearLayout>
下面是四个按钮,我设置了四种颜色区分它。这里我让四个按钮的宽度平分父布局,将这四个按钮的width都设为0dp,然后将weight都设置为1就可以实现。
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp">
<Button
android:id="@+id/btn_add"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="2dp"
android:layout_weight="1"
android:background="#7CFC00"
android:text="添加"
android:textSize="18sp"/>
<Button
android:id="@+id/btn_query"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="2dp"
android:layout_weight="1"
android:background="#DCB5FF"
android:text="查询"
android:textSize="18sp"/>
<Button
android:id="@+id/btn_update"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="2dp"
android:layout_weight="1"
android:background="#97FFFF"
android:text="修改"
android:textSize="18sp"/>
<Button
android:id="@+id/btn_delete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="2dp"
android:layout_weight="1"
android:background="#ACD6FF"
android:text="删除"
android:textSize="18sp"/>
</LinearLayout>
最底下还有一个隐着的TextView,它是用来显示查询到的联系人信息。
<TextView
android:id="@+id/tv_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:textSize="20sp"/>
2、SQLite数据库
2.1、SQLite是什么?
SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持标准SQL语法,还遵循ACID(数据库事务)原则,无需账号,使用起来非常方便!Android内置的SQLite是SQLite 3版本的。
2.2、为什么要用SQLite?
前面我们学习了使用文件与SharedPreference来保存数据,但是在很多情况下,文件并不一定是有效的,如多线程并发访问是相关的;app要处理可能变化的复杂数据结构等等。比如银行的存钱与取钱!使用前两者就会显得很无力或者繁琐,数据库的出现可以解决这种问题,而Android又给我们提供了这样一个轻量级的SQLite,那肯定要好好用啊。
2.3、SQLite有什么特点?
SQLite支持五种数据类型:NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象) 虽然只有五种,但是对于varchar,char等其他数据类型都是可以保存的;因为SQLite有个最大的特点: 你可以将各种数据类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。
比如你可以在Integer类型的字段中存放String字符串,当然除了声明为主键INTEGER PRIMARY KEY的字段只能够存储64位整数。
另外,SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。如下面语句会忽略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQlite通过文件来保存数据库,一个文件就是一个数据库,数据库中又包含多个表格,表格里又有 多条记录,每个记录由多个字段构成,每个字段有对应的值,每个值我们可以指定类型,也可以不指定 类型(主键除外) |
---|
3、SQLite相关的类
3.1、SQLiteOpenHelper
抽象类,我们通过继承该类,然后重写数据库创建以及更新的方法, 我们还可以通过该类的对象获得数据库实例,或者关闭数据库。
3.2、SQLiteDatabase
数据库访问类:我们可以通过该类的对象来对数据库做一些增删改查的操作。
3.3、Cursor
游标,有点类似于JDBC里的resultset,结果集!可以简单理解为指向数据库中某 一个记录的指针。
4、创建数据库与版本管理
Android给我们提供了SQLiteOpenHelper的两个方法:onCreate( )与onUpgrade( )来实现
onCreate(database):首次使用软件时生成数据库表。
onUpgrade(database,oldVersion,newVersion):在数据库的版本发生变化时会被调用, 一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的。
class MyHelper extends SQLiteOpenHelper{
public MyHelper(Context context){
super(context,"dzh.db",null,1);//数据库文件夹名为dzh.db
}
//数据库第一次创建时被调用
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL("CREATE TABLE person(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),phone VARCHAR(20))");
}
//软件版本号发生改变时调用
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
}
上述代码第一次启动应用,我们会创建这个dzh.db的文件,并且会执行onCreate()里的方法, 创建一个person的表,它有两个字段:主键personId和name字段;接着如果我们修改db的版本号,那么下次启动就会调用onUpgrade()里的方法,这里我们没有去填写方法,感兴趣的小伙伴可以试一下!
5、实现增删改查
本项目直接使用Android给我们提供的操作数据库的一些API方法,下面我们用项目中的这部分增删改查的代码来演示下这些API的用法。
@Override
public void onClick(View v){
String name,phone;//声明姓名和电话字段
SQLiteDatabase db;//声明一个数据库db
ContentValues values;//创建values对象
switch (v.getId()){
case R.id.btn_add://添加数据
name=mEtName.getText().toString();//获取字符串数据
phone=mEtPhone.getText().toString();
db=myHelper.getWritableDatabase();//获取可读写SQLiteDatabase对象
values=new ContentValues();//创建ContentValues值
values.put("name",name);//将数据添加到ContentValues对象
values.put("phone",phone);
//参数依次是:表名,强行插入null值的数据列的列名,一行记录的数据
db.insert("person",null,values);//将数据插入到表中
Toast.makeText(this,"信息已添加",Toast.LENGTH_SHORT).show();//提示信息
db.close();//关闭数据库
break;
case R.id.btn_query://查询数据
db=myHelper.getReadableDatabase();
//参数依次是:表名,列名,where约束条件,where中占位符提供具体的值,指定group by的列,进一步约束
Cursor cursor=db.query("person",null,null,null,null,
null,null);//声明并打开游标
if(cursor.getCount()==0){
//获得总的数据条数
mTvShow.setText(" ");
Toast.makeText(this,"没有数据",Toast.LENGTH_SHORT).show();
}else {
cursor.moveToFirst();//指针移动到第一行,成功返回true,也说明有数据
mTvShow.setText("Name: "+cursor.getString(1)+
" ;Tel: "+cursor.getString(2));
}
while (cursor.moveToNext()){
//指针移动到下一行,成功返回true,表明还有元素
mTvShow.append("\n"+"Name:"+cursor.getString(1)+
" ;Tel: "+cursor.getString(2));
}
cursor.close();//关闭游标
db.close();
break;
case R.id.btn_update://修改数据
db=myHelper.getReadableDatabase();
values=new ContentValues();//要修改的数据
values.put("phone",phone=mEtPhone.getText().toString());
//参数依次是表名,修改后的值,where条件,以及约束,如果不指定三和四两个参数,会更改所有行
db.update("person",values,"name=?",
new String[]{
mEtName.getText().toString()});//更新并得到行数
Toast.makeText(this,"信息已修改",Toast.LENGTH_SHORT).show();
db.close();
break;
case R.id.btn_delete://删除数据
db=myHelper.getWritableDatabase();
//参数依次是表名,以及where条件与约束
db.delete("person",null,null);
Toast.makeText(this,"信息已删除",Toast.LENGTH_SHORT).show();
mTvShow.setText(" ");
db.close();
break;
}
}
四、项目效果
1、运行模拟器,启动应用
2、输入姓名和电话,点击添加按钮,显示信息已添加
3、点击查询按钮,发现底下出现已有联系人的信息(因为背景看不清)
4、点击修改按钮,修改已有联系人的信息,将姓名由DZH改为SH,弹出“修改信息成功”的提示信息
5、点击删除按钮,将显示的联系人信息删除,然后点击查询按钮,因为没有联系人数据,弹出“没有数据”的提示信息
6、添加三条新的数据进去,然后查询,可以看到显示了三条记录
7、不要关掉模拟器,在右侧Device File Explorer中找到data文件夹,然后在data文件夹下找到zj.dzh.directory文件夹,继续展开文件夹
找到databases文件夹,有个dzh.db,就是我们创建的数据库,将它保存到本地
8、使用SQLite图形化工具查看db文件,推荐用SQLite Expert Professional打开刚刚的db文件,就会发现有张person表,下面显示了三条联系人记录
五、项目总结
本次通讯录项目主要考验学生对于SQLite数据库的使用,还是比较基础的,刚接触Android的同学只要动手打一遍就会理解了。这些知识点在今后的Android项目中会经常使用,因此希望大家能够熟练掌握上述知识点的使用,方便后续开发项目。
六、源码下载
需要源码学习的同学可以关注我的微信公众号,回复:通讯录,即可免费获取源码,还有更多免费的Android项目等你来学习。
这凡尘到底有什么可留恋的?
原来,都是这些小欢喜啊。
它们在我的生命里唱着歌,跳着舞。
活着,也就成了一件特别让人不舍的事情。
2016.3.12 17:34 YXN
转载:https://blog.csdn.net/qq_42257666/article/details/117387944