第一部分 DBHelper部分
/**
* 数据库Helper类,必须继承自 SQLiteOpenHelper
* 当一个继承自 SQLiteOpenHelper 后需要复写两个方法,分别是 onCreate() 和 onUpgrade()
* onCreate(): onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录
* onUpgrade():onUpGrade是在数据库版本升级的时候调用的,主要用来改变表结构
*
*
* 数据库帮助类要做的事情特别简单:
* 1、复写onCreate() 和 onUpgrade()方法
* 2、在这两个方法里面填写相关的sql语句
*
*
*/
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
/**
* 参数说明:
*
* 第一个参数: 上下文
* 第二个参数:数据库的名称
* 第三个参数:null代表的是默认的游标工厂
* 第四个参数:是数据库的版本号 数据库只能升级,不能降级,版本号只能变大不能变小
*/
super(context, "mintest.db", null, 2);
}
/**
* onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录
*
* 当数据库第一次被创建的时候调用的方法,适合在这个方法里面把数据库的表结构定义出来.
* 所以只有程序第一次运行的时候才会执行
* 如果想再看到这个函数执行,必须写在程序然后重新安装这个app
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table contactinfo (id integer primary key autoincrement, name varchar(20), phone varchar(20))");
}
/**
* 当数据库更新的时候调用的方法
* 这个要显示出来得在上面的super语句里面版本号发生改变时才会 打印 (super(context, "itheima.db", null, 2); )
* 注意,数据库的版本号只可以变大,不能变小,假设我们当前写的版本号是3,运行,然后又改成1,运行则报错。不能变小
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("alter table contactinfo add account varchar(20)");
}
}
第二部分 DAO工具类
/**
* ContactInjfoDao 数据库操作类 dao后缀的都是数据库操作类
*
* 我们这里的每一个 增删改查 的方法都通过getWritableDatabase()去实例化了一个数据库,这里必须这么做
* 不客气抽取 成为一个成员变量, 否则报错,若是觉得麻烦可以通过定义方法来置为null和重新赋值
*
* —— 其实dao类在这里做得事情特别简单:
* 1、定义一个构造方法,利用这个方法去实例化一个 数据库帮助类
* 2、编写dao类的对应的 增删改查 方法。
*
*/
public class ContactInjfoDao {
private DBHelper DBhelper;
/**
* dao类需要实例化数据库Help类,只有得到帮助类的对象我们才可以实例化 SQLiteDatabase
* @param context
*/
public ContactInjfoDao(Context context){
// 将数据库打开帮帮助类实例化,然后利用这个对象
// 调用谷歌的api去进行增删改查
DBhelper = new DBHelper(context);
}
// 增加的方法吗,返回的的是一个long值
public long addDate(String name,String phone){
// 增删改查每一个方法都要得到数据库,然后操作完成后一定要关闭
// getWritableDatabase(); 执行后数据库文件才会生成
// 数据库文件利用DDMS可以查看,在 data/data/包名/databases 目录下即可查看
SQLiteDatabase sqLiteDatabase = DBhelper.getWritableDatabase();
ContentValues contentValues=new ContentValues();
contentValues.put("name",name);
contentValues.put("phone", phone);
// 返回,显示数据添加在第几行
// 加了现在连续添加了3行数据,突然删掉第三行,然后再添加一条数据返回的是4不是3
// 因为自增长
long rowid=sqLiteDatabase.insert("contactinfo",null,contentValues);
sqLiteDatabase.close();
return rowid;
}
// 删除的方法,返回值是int
public int deleteDate(String name){
SQLiteDatabase sqLiteDatabase = DBhelper.getWritableDatabase();
int deleteResult = sqLiteDatabase.delete("contactinfo", "name=?", new String[]{name});
sqLiteDatabase.close();
return deleteResult;
}
/**
* 修改的方法
* @param name
* @param newPhone
* @return
*/
public int updateData(String name,String newPhone){
SQLiteDatabase sqLiteDatabase = DBhelper.getWritableDatabase();
ContentValues contentValues =new ContentValues();
contentValues.put("phone", newPhone);
int updateResult = sqLiteDatabase.update("contactinfo", contentValues, "name=?", new String[]{name});
sqLiteDatabase.close();
return updateResult;
}
/**
* 查询的方法(查找电话)
* @param name
* @return
*/
public String alterDate(String name){
String phone = null;
SQLiteDatabase readableDatabase = DBhelper.getReadableDatabase();
// 查询比较特别,涉及到 cursor
Cursor cursor = readableDatabase.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
if(cursor.moveToNext()){
phone=cursor.getString(0);
}
cursor.close(); // 记得关闭 corsor
readableDatabase.close(); // 关闭数据库
return phone;
}
}
第三部分 Activity部分
public class MainActivity extends AppCompatActivity {
private EditText mEtName, mEtPhone;
private ContactInjfoDao mDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDao = new ContactInjfoDao(MainActivity.this);
mEtName = (EditText) findViewById(R.id.mEtName);
mEtPhone = (EditText) findViewById(R.id.mEtPhone);
}
//向数据库中添加数据
public void add(View view){
String name=mEtName.getText().toString().trim();
String phone=mEtPhone.getText().toString().trim();
if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
return;
}else{
long addLong = mDao.addDate(name, phone);
if(addLong==-1){
Toast.makeText(this,"添加失败",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"数据添加在第 "+addLong+" 行",Toast.LENGTH_SHORT).show();
}
}
}
//删除数据库中的数据
public void delete(View view){
String name=mEtName.getText().toString().trim();
if(TextUtils.isEmpty(name)){
Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
return;
}else{
int deleteDate = mDao.deleteDate(name);
if(deleteDate==-1){
Toast.makeText(this,"删除失败",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"成功删除 "+deleteDate+" 条数据",Toast.LENGTH_SHORT).show();
}
}
}
//修改数据中的数据
public void update(View view){
String name=mEtName.getText().toString().trim();
String phone=mEtPhone.getText().toString().trim();
if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
return;
}else{
int count=mDao.updateData(name, phone);
if(count==-1){
Toast.makeText(this,"更新失败",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"数据更新了 "+count+" 行",Toast.LENGTH_SHORT).show();
}
}
}
//查询数据库中的数据
public void query(View view){
String name=mEtName.getText().toString().trim();
if(TextUtils.isEmpty(name)){
Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
return;
}else{
String phoneResult = mDao.alterDate(name);
Toast.makeText(this,"手机号码为: "+phoneResult,Toast.LENGTH_SHORT).show();
}
}
}
第四部分 布局部分
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:id="@+id/mEtName"
android:hint="请输入联系人的姓名"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</EditText>
<EditText
android:id="@+id/mEtPhone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入联系人的电话"
android:inputType="phone" />
<Button
android:onClick="add"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="添加" />
<Button
android:onClick="delete"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="删除" />
<Button
android:onClick="update"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="修改" />
<Button
android:onClick="query"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="查询" />
</LinearLayout>