Android SQLite

一、数据库的创建

1.定义一个类继承SQLiteOpenHelper

2.父类中没有无参的构造方法,要写构造方法

public MyOpenHelper(Context context) {
    /*
        context:上下文
        name:数据库的名字
        factory:目的创建cursor对象
        version:数据库的版本,从1开始
    */
    super(context, name, factory, version);
}

3.MainActivity中调用MyOpenHelper()方法创建数据库

MyOpenHelper myOpenHelper = new MyOpenHelper(getApplicationContext());
// (1)创建或打开一个数据库,第一次调用为创建
SQLiteDatabase writableDatabase = myOpenHelper.getWritableDatabase();
// (2)创建或打开一个数据库,第一次调用为创建,区别:如果磁盘满了,返回只读的
SQLiteDatabase readableDatabase = myOpenHelper.getReadableDatabase();

4.onCreate方法

      1)数据库第一次被创建的时候调用,所以此方法适合做表结构的初始化

      2).execSQL();内写SQL语句

public void onCreate(SQLiteDatabase db) {
    //创建一个表,有id,name两个列
    db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20))");
}

      3)生成的数据库文件可用SQLiteExpert工具打开

5.onUpgrade方法

      1)当数据库版本升级的时候调用,此方法适合做表结构的更新

public MyOpenHelper(Context context) {
    super(context, "pqx.db", null, 2);                          //版本改为2
}
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("alter table info add phone varchar(20)");       //添加一列phone
}

      2)版本只能升不能降

6.增删查改SQL语句的编写

      1)在SQLiteExpert中

insert into info (name,phone) values('李四','13280025834');
insert into info (name,phone) values('谭立波','17616138165');
update info set name='潘擎轩' where _id=1;
delete from info where name='谭立波';
delete from info;
select name,phone from info;

      2)在Android Studio中

//(1)定义4个按钮,分别是增、删、查、改  ----以增为例----
public void cilck(View v){
    //(2)再点击事件中,首先获取数据库对象
    SQLiteDatabase writableDatabase = myOpenHelper.getWritableDatabase();
    //(3)执行增加一条的SQL语句
    db.execSQL("insert into info (name,phone) values(?,?)",new Object[]{"张三","13888888"});
    //(4)数据库用完需要关闭
    db.close();
}
public void click(View v){                                       //查询按钮的点击事件
    SQLiteDatabase db = myOpenHelper.getWritableDatabase();
    Cursor cursor = db.rawQuery("select * where info", null);    //通过查询返回一个Cursor集
    if (cursor!=null && cursor.getCount()>0){                    //如果查询返回的不为空,并且存在1行以上数据
        while (cursor.moveToNext()){                             //cursor一直往下移
            String name = cursor.getString(1);                   //参数为列的索引
            String phone = cursor.getString(2);
            System.out.println("name:"+name+"-----phone:"+phone);
        }
    }
}

      3)使用SQL方式缺点:

               1.SQL语句容易写错

               2.执行SQL语句没有返回值,不容易进行判断

      4)使用SQL方式优点:

               1.容易进行多表查询

      5)使用命令行工具   sqlite3可以打开数据库

               1.打开 cmd 后输入 adb shell ,然后进入/data/data/包/databases下

               2.输入:sqlite3 数据库名。然后输入sql语句即可

               3.改变dos命令行的编码方式:chcp 936是改变为默认的GBK编码方式,chcp 65001是改变为utf-8编码方式

7.使用谷歌封装好的api进行增删查改

      1)增

public void click(View v){
    SQLiteDatabase db = myOpenHelper.getWritableDatabase();

    ContentValues values =new ContentValues();                  //ContentValues存储数据的集合,只能存基本数据类型
    values.put("name","王五");
    values.put("phone","110");
                                                                //插入
    long yon = db.insert("info", null, values);                 //返回新插入行的id

    db.close();
    if(yon>0){
        Toast.makeText(MainActivity.this,"添加成功",Toast.LENGTH_LONG).show();
    }else {
        Toast.makeText(MainActivity.this,"添加失败",Toast.LENGTH_LONG).show();
    }
}

      2)删

//info为表名,name为条件(键/列标题),new String[]{}内写要删除的条件的值
int delete = db.delete("info", "name=?", new String[]{"王五"});    //返回的为受影响的行数

Toast.makeText(MainActivity.this,"删除了"+delete+"行",Toast.LENGTH_LONG).show();

      3) 更新(改)

ContentValues values =new ContentValues();
values.put("phone","114");
int update = db.update("info", values, "name=?", new String[]{"王五"});
Toast.makeText(MainActivity.this,"更新了"+update+"行",Toast.LENGTH_LONG).show();

      4)查

/*
table:表名
columns:想要查询哪一列,若查询所有输入null即可
selection:根据什么查询,值用?占位
selectionArgs:上一个参数的值
groupBy:是否分组,不用的话null即可
having:过滤条件
orderBy:排序
*/
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy);
//例
Cursor cursor = db.query("info",new String[]{"phone"},"name=?",new String[]{"王五"},null,null,null);
if (cursor!=null && cursor.getCount()>0){
    while (cursor.moveToNext()){
        String phone = cursor.getString(0);
        System.out.println("phone:"+phone);
    }
}

      5)优点:

             1.写法简单,不需要复杂的sql语句,不容易写错

             2.有返回值,方便开发者进行开发

      6)缺点

             如果有多张表,不容易进行查询

二、数据库中的事物

public void click(View v){
    SQLiteDatabase db = myOpenHelper.getReadableDatabase();
    //使用事物进行转账
    db.beginTransaction();//开启事物
    try{
        db.execSQL("update info set money = money-100 where name=?",new Object[]{"王五"});//更新数据money-100
        db.execSQL("update info set money = money+100 where name=?",new Object[]{"李四"});//更新数据money+100

        db.setTransactionSuccessful();          //给当前事物设置一个成功的标记,如果没有执行到,回滚
    }catch (Exception e){
        Toast.makeText(MainActivity.this,"服务器繁忙,请稍后再试",Toast.LENGTH_LONG).show();
    } finally {
        db.endTransaction();//关闭事物
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值