1 数据库的介绍
sqlite:轻量级的数据库,是嵌入到手机里面的数据库
那么什么时候使用数据库呢?当有大量相似结构的数据需要存储的时候
File file = new File("info.txt");
2 数据库的创建
【1】定义一个类继承SQLiteOpenHelper
【2】在MainActivity的onCreate()方法中实现:
MyOpenHelper myOpenHelper = newMyOpenHelper(getApplicationContext());
//[2.1]打开或者是创建数据库,如果是第一次就是创建
SQLiteDatabase sqLiteDatabase = myOpenHelper.getWritableDatabase();
//[2.2]打开或者创建数据库 如果是第一次就是创建如果磁盘满了返回一个只读的
SQLiteDatabase readableDatabase = myOpenHelper.getReadableDatabase();
备注:[2.1]和[2.2]二选一
3 数据库的onCreate()方法和onUpdate()方法
onCreate()方法:当数据库第一次创建的时候调用,适合初始化表的结构
onUpdate()方法:当数据库版本需要更新的时候调用,适合做表结构的更新
补充:
[1]使用SQLite Expert Professional这个工具可以打开我们创建的数据库
[2]需要提前安装SQLite Expert Professional这个工具 像QQ一样安装
回顾SQL语句:
1. insert into info(name,phone)values(‘王五’,’1377777’);(增)
2. delete from info where name=’王五’;(删)
3. update info set phone=’13999999’ where name=’王五’;(改)
4. select name,phone from info(查)
4 使用SQL语句对数据库进行增删改查
public class MainActivity extends Activity {
private MyOpenHelper myOpenHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myOpenHelper = new MyOpenHelper(getApplicationContext());
//打开或者是创建数据库,如果是第一次 就是创建
//SQLiteDatabase sqLiteDatabase = myOpenHelper.getWritableDatabase();
//打开或者创建数据库 如果是第一次就是创建 如果磁盘满了 返回一个只读的
//SQLiteDatabase readableDatabase = myOpenHelper.getReadableDatabase();
}
//点击按钮增加一条记录
public void click1(View v)
{
//[1]获取数据库对象
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//[2]执行增加一条记录的方法
db.execSQL("insert into info(name,phone) values(?,?)", new Object[]{"张三","1388888"});
//[3]数据库用完需要关闭
db.close();
}
//删除
public void click2(View v)
{
//
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//
db.execSQL("delete from info where name=?",new Object[]{"张三"});
//
db.close();
}
//更新
public void click3(View v)
{
//
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//
db.execSQL("update info set phone=? where name=?", new Object[]{"13999999","张三"});
//
db.close();
}
//查找
public void click4(View v)
{
//
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
//
Cursor cursor = db.rawQuery("select * from info", null);
if (cursor!=null && cursor.getCount()>0) {
while(cursor.moveToNext())
{
String name = cursor.getString(1);//参数代表的是列的索引
String phone = cursor.getString(2);
System.out.println("name:"+name+"-----"+phone);
}
}
//
// db.close();
// cursor.close();
}
}
缺点:1 SQL语句容易写错
2 执行SQL语句没有返回值 不容易进行判断
优点:1 容易进行多表查询
【4.1】使用命令行工具sqlite3 可以打开数据库
【4.2】改变dos的编码方式:
使用指令:chcp 936 (改变成GBK编码方式)
使用指令:chcp 65001 (改变成utf-8编码方式)
5 使用谷歌封装好的API对数据库进行增删改查
public class MainActivity extends Activity {
private MyOpenHelper myOpenHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myOpenHelper = new MyOpenHelper(getApplicationContext());
//打开或者是创建数据库,如果是第一次 就是创建
//SQLiteDatabase sqLiteDatabase = myOpenHelper.getWritableDatabase();
//打开或者创建数据库 如果是第一次就是创建 如果磁盘满了 返回一个只读的
//SQLiteDatabase readableDatabase = myOpenHelper.getReadableDatabase();
}
//点击按钮增加一条记录
public void click1(View v)
{
//[1]获取数据库对象
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//[2]执行增加一条记录的方法
//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
long insert = db.insert("info", null, values);//底层就在组拼sql语句
//[3]数据库用完需要关闭
db.close();
if (insert>0) {
Toast.makeText(getApplicationContext(), "添加成功!", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(getApplicationContext(), "添加失败!", Toast.LENGTH_LONG).show();
}
}
//删除
public void click2(View v)
{
//
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//
//db.execSQL("delete from info where name=?",new Object[]{"张三"});
//返回值代表影响的行数
int delete = db.delete("info", "name=?",new String[]{"王五"});
//
db.close();
Toast.makeText(getApplicationContext(), "删除了"+delete+"行", Toast.LENGTH_LONG).show();
}
//更新
public void click3(View v)
{
//
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//
//db.execSQL("update info set phone=? where name=?", new Object[]{"13999999","张三"});
ContentValues values = new ContentValues();
values.put("phone", "114");
//代表更新了多少行
int update = db.update("info", values, "name=?", new String[]{"王五"});
//
db.close();
Toast.makeText(getApplicationContext(), "更新了"+update+"行", Toast.LENGTH_LONG).show();
}
//查找
public void click4(View v)
{
//
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
//
//columns:代表你要查询的列
Cursor cursor = db.query("info", new String[]{"phone"}, "name=?", new String[]{"王五"}, null, null, null);
//Cursor cursor = db.rawQuery("select * from info", null);
if (cursor!=null && cursor.getCount()>0) {
while(cursor.moveToNext())
{
String phone = cursor.getString(0);
System.out.println("phone:"+phone);
}
}
//
// db.close();
// cursor.close();
}
}
优点:[1]写法简单不需要写复杂的sql语句 不容易写错
[2]有返回值方便开发者进行开发
缺点:[1]如果有多张表 使用谷歌封装好的API不容易进行查询
6 两种增删改查的优缺点
见上!!!
7 Android中数据库的事物的介绍
事物:执行一段逻辑,要么同时成功,要么同时失败 典型案例:银行转账
public void click(View v)
{
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
//使用事务进行转账!
db.beginTransaction();
try {
db.execSQL("update info set money=money-100 where name=?", new Object[]{"张三"});
db.execSQL("update info set money=money+100 where name=?", new Object[]{"李四"});
//给当前事务设置一个成功的标记
db.setTransactionSuccessful();
}
catch(Exception e)
{
Toast.makeText(getApplicationContext(), "服务器忙,请稍后再转", Toast.LENGTH_LONG).show();
}
finally {
db.endTransaction();
}
}