11.数据库的初次使用
数据库:
存在大量的有相同类型属性的数据的时候使用。
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();
浙公网安备 33010602011771号