数据库:
存在大量的有相同类型属性的数据的时候使用。
SQLiteOpenHelper:管理数据库的创建方法
方法为抽象方法,意思是需要继承,继承完毕之后需要对抽象方法进行实现
用于对数据库进行查看和操作的软件下载地址
生成的数据库文件在
在根文件夹下的 /data/data/your package name/database/xxx.db
在Tools -- android -- android device monitor进入DDMS
找到FileExplorer,然后进入上面的那一串,
想要导出文件需要找到右上方,
1.定义一个类,继承SQLiteOpenHelper,
2.需要添加一个构造方法,
第一个context参数上下文,
name是创建数据库的名字;
factory游标,默认用 null;
version 数据库的版本,从一开始
本章实现了数据库的增删改查,通过手机创建数据库,修改数据库,读取数据库的全部过程,
介绍功能,

对四个按钮和两个显示区域的操作,实现
对数据库内容的增删改查
点击 增加操作 添加一个对象信息,有id 姓名 以及电话号码,
点击 删除操作 减少一个对象信息,可以通过各种特征来进行删除,例如删除名字为张三的所有对象的所有信息
点击 更新操作 可以对一个对象信息的内容进行更改,这里叫更新操作,
点击 查询操作 可以对对象信息进行查询,其中查询信息可以进行删减,如删除姓名是张三的一行,删除id为3的一行等等,查询后将结果显示到我们的两个展板上
两个TextView用来展示当前的数据库中的对象信息
由于对数据库进行操作我们有两种方法,
第一种是,使用sql语句对数据库中的信息进行增删改查
另一种,起源于第一种,但是使用的android的api进行的快捷开发操作,
两种方法我们都做尝试,所以使用两个TextView,并且添加用户时也会一下添加两个。
下面是布局代码
xml
<?xml version="1.0" encoding="utf-8"?>
<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="com.example.xialm.sq_text1.MainActivity">
<TextView
android:id="@+id/showw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bb_1"
android:text="增加操作"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bb_2"
android:text="删除操作"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bb_3"
android:text="改动操作"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bb_4"
android:text="查询操作"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bb_5"
android:text="hello world?"
/>
<TextView
android:id="@+id/showq"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="展板二"
/>
</LinearLayout>
MainActivity
package com.example.xialm.sq_text1;
import android.app.ActionBar;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private MySq new_mysq;
private TextView tt,tt_1;
private String name = "";
private String phone = "";
private String data1 = "",data2="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tt = (TextView) findViewById(R.id.showw);
tt_1 = (TextView) findViewById(R.id.showq);
//拿到的是方法,实例化
new_mysq = new MySq(getApplicationContext());
//拿到方法后,打开或者创建一个数据库,第一次是创建
//SQLiteDatabase writable = new_mysq.getWritableDatabase();
//一样的 打开或者创建一个数据库,
//区别是当磁盘满了的时候,数据库只可以进行访问
//SQLiteDatabase readable = new_mysq.getReadableDatabase();
}
//开始增删改查的监听事件
//增加
public void bb_1(View view) {
Toast.makeText(MainActivity.this, "开始添加操作", Toast.LENGTH_SHORT).show();
//拿出实例
SQLiteDatabase db = new_mysq.getWritableDatabase();
//方法一,添加一个张三和一个电话
//使用了占位符,方法灵活
db.execSQL("insert into info(name,phone) values(?,?)", new Object[]{"张三", "1388888"});
//方法二
//封装好的方法::::
//table 表名
//ContentValues 内部封装了一个map key: 对应列的名字 value对应的值
ContentValues values = new ContentValues();
values.put("name", "王五");
values.put("phone", "110");
//返回值代表插入新行的id,这个null类似于默认值
long insert = db.insert("info", null, values); //底层就在组拼sql语句
//添加成功的话一定是大于0的
if (insert>0) {
Toast.makeText(getApplicationContext(), "添加成功,这是"+insert+"了", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getApplicationContext(), "添加fail", Toast.LENGTH_SHORT).show();
}
//数据库用完之后就关闭奥,当然如果频繁使用时,也可以不关闭
db.close();
}
//删除
public void bb_2(View view) {
Toast.makeText(MainActivity.this, "正在删除操作", Toast.LENGTH_SHORT).show();
SQLiteDatabase db = new_mysq.getWritableDatabase();
//方法一:占位符,删掉用名字作为删除条件
db.execSQL("delete from info where name=?", new Object[]{"张三"});
//方法二:使用封装好的快乐方法
//返回值代表影响的行数,删掉用名字作为删除条件
int delete = db.delete("info", "name=?", new String[]{"王五"});
Toast.makeText(getApplicationContext(), "删除了"+delete+"行", Toast.LENGTH_SHORT).show();
//使用完这个数据库之后要关闭,
db.close();
}
//改动
public void bb_3(View view) {
//Toast.makeText(MainActivity.this,"正在改动操作",Toast.LENGTH_SHORT).show();
//第一种改动的方法
SQLiteDatabase db = new_mysq.getWritableDatabase();
db.execSQL("update info set phone=? where name=? ", new Object[]{"10086", "张三"});
//方法二
ContentValues values = new ContentValues();
values.put("phone", "114");
//返回值代表更新了多少行 ,
int update = db.update("info", values, "name=?", new String[]{"王五"});
Toast.makeText(getApplicationContext(), "更新了"+update+"行", Toast.LENGTH_SHORT).show();
//关闭数据库
db.close();
}
//查询
public void bb_4(View view) {
//Toast.makeText(MainActivity.this,"正在查询操作",Toast.LENGTH_SHORT).show();
SQLiteDatabase db = new_mysq.getWritableDatabase();
//方法一
Cursor cursor = db.rawQuery("select * from info", null);
//Cursor cursor = db.rawQuery("select * = from info", null);
//这里的rawQuery返回的是结果集
// 结果集是对象包含符合SQL 语句中条件的所有行集合。
// 它通过一套get 方法,这些get 方法可以访问当前行中的不同列,
// 提供了对这些行中数据的访问。结果集一般是一个表,其中有查询所返回的列标题及相应的值。
//具体方法有,获得行获得列数,获得内容,获得所有列的名字
//将指针移动到首或者是尾或者是下一个
//如果返回的结果集不是空的,并且这个行数也不是空的
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
name = cursor.getString(1);
phone = cursor.getString(2);
data1 += name + ":" + phone + "\n";
}
tt.setText(data1);
data1 = "";
} else {
tt.setText(data1);
Toast.makeText(MainActivity.this, "数据为空", Toast.LENGTH_SHORT).show();
}
//方法二:
//columns 代表你要查询的列
//selection 根据什么查询phone
// Cursor cursor2 = db.query("info", new String[]{"name","phone"}, "name=?", new String[]{"王五"}, null, null, null);
Cursor cursor2 = db.query("info", null, null, null, null, null, null);
// Cursor cursor2 = db.rawQuery("select * from info", null);
if (cursor2 != null && cursor2.getCount() > 0) {
while (cursor2.moveToNext()) {
//columnIndex代表列的索引
String name2 = cursor2.getString(1);
String phone2 = cursor2.getString(2);
data2 += name2 + ":" + phone2 + "\n";
}
tt_1.setText(data2);
data2 = "";
}else
{
tt_1.setText(data2);
data2 = "";
}
db.close();
}
public void bb_5(View view)
{
tt.setText("hello,world");
}
}
数据库类
MySq这个类
package com.example.xialm.sq_text1;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.sql.ResultSet;
/**
* Created by xialm on 2019/10/3.
*/
public class MySq extends SQLiteOpenHelper {
public MySq(Context context) {
super(context, "first_text.db", null, 5);
//上下文
//数据库的名字
//游标,默认使用的是null
//使用版本,默认使用1
}
//创建属性,一般用来将数据库进行表格的初始化操作
public void onCreate(SQLiteDatabase db) {
//使用了数据库额语句创建了一个,info表,id是整形,后面这个是什么键,名字行包含20
db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
//db.execSQL("insert into info(name,phone) values(?,?)", new Object[]{"张三","1388888"});
//添加两行时
//db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
// ResultSet
}
@Override
//当我们的版本更新的时候,更新在创建的里面
//常常用来做表结构的更新
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//添加一列,手机列
db.execSQL("alter table info add phone varchar(20)");
}
}
本章总结
//使用了数据库额语句创建了一个,info表,id是整形,后面这个是什么键,名字行包含20
db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
//添加一列,手机列
db.execSQL("alter table info add phone varchar(20)");
private MySq new_mysq;
new_mysq = new MySq(getApplicationContext());
//拿出实例
SQLiteDatabase db = new_mysq.getWritableDatabase();
//增加操作
//方法一,添加一个张三和一个电话
//使用了占位符,方法灵活
db.execSQL("insert into info(name,phone) values(?,?)", new Object[]{"张三", "1388888"});
//方法二
//封装好的方法::::
//table 表名
//ContentValues 内部封装了一个map key: 对应列的名字 value对应的值
ContentValues values = new ContentValues();
values.put("name", "王五");
values.put("phone", "110");
//返回值代表插入新行的id,这个null类似于默认值
long insert = db.insert("info", null, values); //底层就在组拼sql语句
//其中可以使用insert判断有没有添加成功,进行一下判断
if (insert>0) {
Toast.makeText(getApplicationContext(), "添加成功,这是"+insert+"了", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getApplicationContext(), "添加fail", Toast.LENGTH_SHORT).show();
}
//数据库用完之后就关闭奥,当然如果频繁使用时,也可以不关闭
db.close();
//删除操作
//拿到实例
SQLiteDatabase db = new_mysq.getWritableDatabase();
//方法一:占位符,删掉用名字作为删除条件
db.execSQL("delete from info where name=?", new Object[]{"张三"});
//方法二:使用封装好的快乐方法
//返回值代表影响的行数,这里删掉用名字作为删除条件
int delete = db.delete("info", "name=?", new String[]{"王五"});
Toast.makeText(getApplicationContext(), "删除了"+delete+"行", Toast.LENGTH_SHORT).show();
//使用完这个数据库之后要关闭,
db.close();
//更新操作
//拿到实例
//第一种改动的方法
SQLiteDatabase db = new_mysq.getWritableDatabase();
db.execSQL("update info set phone=? where name=? ", new Object[]{"10086", "张三"});
//方法二
ContentValues values = new ContentValues();
values.put("phone", "114");
//返回值代表更新了多少行 ,
int update = db.update("info", values, "name=?", new String[]{"王五"});
Toast.makeText(getApplicationContext(), "更新了"+update+"行", Toast.LENGTH_SHORT).show();
//关闭数据库
db.close();
//查询操作
//Toast.makeText(MainActivity.this,"正在查询操作",Toast.LENGTH_SHORT).show();
SQLiteDatabase db = new_mysq.getWritableDatabase();
//方法一
Cursor cursor = db.rawQuery("select * from info", null);
//Cursor cursor = db.rawQuery("select * = from info", null);
//这里的rawQuery返回的是结果集
// 结果集是对象包含符合SQL 语句中条件的所有行集合。
// 它通过一套get 方法,这些get 方法可以访问当前行中的不同列,
// 提供了对这些行中数据的访问。结果集一般是一个表,其中有查询所返回的列标题及相应的值。
//具体方法有,获得行获得列数,获得内容,获得所有列的名字
//将指针移动到首或者是尾或者是下一个
//如果返回的结果集不是空的,并且这个行数也不是空的
if (cursor != null && cursor.getCount() > 0) {
//看啊看,再往下面走会不会已经走到了尽头
while (cursor.moveToNext()) {
name = cursor.getString(1);
phone = cursor.getString(2);
//把所有的名字电话拼装起来
data1 += name + ":" + phone + "\n";
}
tt.setText(data1);
data1 = "";
} else {
tt.setText(data1);
Toast.makeText(MainActivity.this, "数据为空", Toast.LENGTH_SHORT).show();
}
//方法二:
//columns 代表你要查询的列
//selection 根据什么查询phone
//Cursor cursor2 = db.query("info", new String[]{"name","phone"}, "name=?", new String[]{"王五"}, null, null, null);
//没有查询条件代表全查
Cursor cursor2 = db.query("info", null, null, null, null, null, null);
// Cursor cursor2 = db.rawQuery("select * from info", null);
if (cursor2 != null && cursor2.getCount() > 0) {
while (cursor2.moveToNext()) {
//columnIndex代表列的索引
String name2 = cursor2.getString(1);
String phone2 = cursor2.getString(2);
data2 += name2 + ":" + phone2 + "\n";
}
//实现显示完成之后字符串清空,下次查询时再次重组字符串
tt_1.setText(data2);
data2 = "";
}else
{
//如果没有东西也要显示一下
tt_1.setText(data2);
data2 = "";
}
db.close();