SQLite 数据库的学习
什么情况下我们才用数据库做数据存储?
大量数据结构相同的数据需要存储时。
创建数据库的步骤
1.创建一个类集成SqliteOpenHelper 。
需要添加一个构造方法 实现2个方法oncreate ,onupgrade
构造方法的参数介绍:
super(context, “info.db”, null,1);
// context :上下文,
// name 数据库文件的名称 ,
// factory :用来创建cursor 对象 默认为 null
//version :数据库的版本号 从1开始 发生改变将调用onupgrade 方法。
2. 创建这个 帮助类的一个 对象,调用getReadleDatabase()方法 ,会帮助我们打开创建一个数据库 ;
3. 重写 oncreate 和onupgrade 方法:
oncreate 方法是数据库第一次创建的时候会被调用,特别适合
做表结构的初始化 执行sql语句 ,SQliteDataBase db 可以用来执行sql 语句
onupgrade 方法数据库版本号发生改变时才会执行,特别适合做表结构的修改
帮助类对象的getWriteableDatabASE 和getReadableDataBase 可以帮助我们获取一个数据库操作对象sqlitedatabase :
区别:
getReadableDatabase:
先尝试以读写方式打开数据库,如果磁盘空间满了,他会重新尝试以只读方式打开数据库。
getWritableDatabase:
直接以读写方式打开数据库,如果磁盘空间满了,就直接报错。
按照上述步骤实现:
创建MySqliteHelper.java 类
public class MySqliteHelper extends SQLiteOpenHelper {
public MySqliteHelper(Context context) {
super(context, "info.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table info(_id integer primary key autoincrement ,name varchar(20),phone varchar(11))"); //创建表 table 后边 的info 就是数据表名 ,—id是自增主键 ,包括一个name 属性值
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("alter table info add phone varchar(22)");
}
}
第二步 :
在 Activity 或fragment 里
MySqliteHelper mySqliteHelper = new MySqliteHelper(getActivity());
SQLiteDatabase sqLiteDatabase = mySqliteHelper.getReadableDatabase();
这个时候数据库就创建完毕:数据库存放的 内存卡下
data/data/packagename/databases 文件夹下
可以使用SQLite Expert Professional查看工具进行导出数据库查看
下载地址链接:https://pan.baidu.com/s/16UJpJ3AZwo4Y6GGCSBn2Ig
提取码:p2ui
第二步 增删改查 第一种使用 sql语句
创建一个infodao.java类 来进行增删改查 的操作:
创建一个bean实体类 用于添加数据:
public class InfoDao {
MySqliteHelper mySqliteHelper;
public InfoDao(Context context) {
mySqliteHelper = new MySqliteHelper(context);
}
public void add(infobean bean) {
SQLiteDatabase db = mySqliteHelper.getReadableDatabase();
db.execSQL("insert into info(name,phone) values(?,?);", new Object[]{bean.name, bean.phone});
db.close();
}
public void delete(String name) {
SQLiteDatabase db = mySqliteHelper.getReadableDatabase();
db.execSQL("delete from info where name=?;", new Object[]{name});
db.close();
}
public void update(infobean infobean) {
SQLiteDatabase db = mySqliteHelper.getReadableDatabase();
db.execSQL("update info set phone=?where name=?;", new Object[]{infobean.phone, infobean.name
});
db.close();
}
public void query(String name) {
SQLiteDatabase db = mySqliteHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select _id,name,phone from info where name=?;", new String[]{name});
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name_str = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println("_id:" + id + ";name:" + name_str + ";phone:" + phone);
}
cursor.close();
}
db.close();
}
}
Activity 里进行添加数据的方法;
@Override
public void onClick(View v) {
InfoDao dao = new InfoDao(getActivity());
switch (v.getId()) {
case R.id.addbtn:
infobean bean = new infobean();
bean.name = "张三";
bean.phone = "119";
dao.add(bean);
infobean bean1 = new infobean();
bean1.name = "李四";
bean1.phone = "120";
dao.add(bean1);
break;
case R.id.delbtn:
dao.delete("张三");
break;
case R.id.update_btn:
infobean bean2 = new infobean();
bean2.name = "张三";
bean2.phone = "11999999999999";
dao.update(bean2);
break;
case R.id.query_btn:
dao.query("张三");
dao.query("李四");
break;
}
}
第二种增删改查的方法;
public class InfoDao {
MySqliteHelper mySqliteHelper;
public InfoDao(Context context) {
mySqliteHelper = new MySqliteHelper(context);
}
public boolean add(infobean bean) {
SQLiteDatabase db = mySqliteHelper.getReadableDatabase();
//db.execSQL("insert into info(name,phone) values(?,?);", new Object[]{bean.name, bean.phone});
//table: 表名 , nullColumnHack:可以为空,标示添加一个空行, values:数据一行的值 , 返回值:代表添加这个新行的Id ,-1代表添加失败
ContentValues values = new ContentValues();
values.put("name", bean.name);
values.put("phone", bean.phone);
long result = db.insert("info", null, values);
db.close();
if (result != -1) {//-1代表失败
return true;
} else {
return false;
}
}
public int delete(String name) {
SQLiteDatabase db = mySqliteHelper.getReadableDatabase();
// db.execSQL("delete from info where name=?;", new Object[]{name});
//table :表名, whereClause: 删除条件, whereArgs:条件的占位符的参数 ; 返回值:成功删除多少行
int result = db.delete("info", "name=?", new String[]{name});
db.close();
return result;
}
public int update(infobean infobean) {
SQLiteDatabase db = mySqliteHelper.getReadableDatabase();//
db.execSQL("update info set phone=?where name=?;", new Object[]{infobean.phone, infobean.name// });
ContentValues values = new ContentValues();
values.put("phone", infobean.phone);
//table:表名, values:更新的值, whereClause:更新的条件, whereArgs:更新条件的占位符的值,返回值:成功修改多少行
int result = db.update("info", values, "name=?", new String[]{infobean.name});
db.close();
return result;
}
public void query(String name) {
SQLiteDatabase db = mySqliteHelper.getReadableDatabase();
// Cursor cursor = db.rawQuery("select _id,name,phone from info where name=?;", new String[]{name});
//table:表名, columns:查询的列名,如果null代表查询所有列; selection:查询条件, selectionArgs:条件占位符的参数值,
//groupBy:按什么字段分组, having:分组的条件, orderBy:按什么字段排序
Cursor cursor = db.query("info", new String[]{"_id", "name", "phone"}, "name=?", new String[]{name}, null, null, "_id desc");
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name_str = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println("_id:" + id + ";name:" + name_str + ";phone:" + phone);
}
cursor.close();
}
db.close();
}
MainActivity 的修改
@SuppressLint("WrongConstant")
@Override
public void onClick(View v) {
InfoDao dao = new InfoDao(getActivity());
switch (v.getId()) {
case R.id.addbtn:
infobean bean = new infobean();
bean.name = "张三";
bean.phone = "119";
boolean result = dao.add(bean);
if (result) {
Toast.makeText(getActivity(), "添加成功", 0).show();
} else {
Toast.makeText(getActivity(), "添加失败", 0).show();
}
break;
case R.id.delbtn:
int del = dao.delete("张三");
Toast.makeText(getActivity(), "成功删除del" + del + "行", 0).show();
break;
case R.id.update_btn:
infobean bean2 = new infobean();
bean2.name = "张三";
bean2.phone = "11999999999999";
int res = dao.update(bean2);
Toast.makeText(getActivity(), "成功修改" + res + "行", 0).show();
break;
case R.id.query_btn:
dao.query("张三");
dao.query("李四");
break;
}
}