SQLite数据库的基本操作

创建数据库

新建类,继承android.database.sqlite.SQLiteOpenHelper
实现里面的方法

public class MyOpenHelper extends SQLiteOpenHelper {

    public MyOpenHelper(Context context, String name, CursorFactory factory,
            int version) {
        super(context, name, factory, version);

    }

    //数据库创建时此方法会调用
    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    //数据库升级时此方法会调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

1,构造方法

    public MyOpenHelper(Context context, String name, CursorFactory factory,
            int version) {
        super(context, name, factory, version);
    }

context:上下文,用的时候把activity传进来就行
name:数据库文件的名字
factory:游标工厂,创建游标对象,一般传null,使用默认的
version:数据库的版本号,方便升级用,int数据,必须从1开始,只要设置一个较大的值就会升级
2,用单元测试框架测试创建数据库代码是否正常执行

public class TestCase extends AndroidTestCase {

        public void test(){
            //getContext():获取虚拟上下文
            MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 3);
            //如果数据库不存在,先创建数据库,再获取可读可写数据库,如果数据库存在,就直接打开
            SQLiteDatabase db = oh.getWritableDatabase();
            //先创建数据库再打开数据库,当手机存储空间满了,就返回只读数据库,现在不用,一般很难满
            //SQLiteDatabase db = oh.getReadableDatabase();
        }
}

注:测试框架中没有上下文,getContext()获取虚拟上下文

数据库的增删改查

  • SQL语句:
    • insert into person (name, phone, money) values (‘张三’, ‘138777777’, 1000);
    • delete from person where name = ‘李四’ and _id = 4;
    • update person set money = 6000 where name = ‘李四’;
    • select name, phone from person where name = ‘张三’;

创建表

一般放在创建数据库的onCreat方法里面,在创建库的同时表也就创建了出来,如果是对数据库进行升级,添加表的方法就放在upgrate方法里面

    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table person(_id integer primary key autoincrement, name char(10), salary char(20), phone integer(20))");
    }

往表里插入数据

        public void insert(){
            MyOpenHelper oh = new MyOpenHelper(getContext(),  "people.db", null, 3);
            SQLiteDatabase db = oh.getWritableDatabase();
            db.execSQL("insert into person (name, salary, phone )values(?, ?, ?)",new Object[]{"Tom","13000", 1384777777});
            //规范,数据库执行完毕要关掉
            db.close();
        }

注意:
1,执行测试的时候要把方法名选中再执行,否则得不到想要的结果
2,SQLite不检测数据类型,因为SQLite是轻量级数据库,占用资源少,牺牲了一部分功能,没有其它数据库那么严谨,数据库里全部都是字符串
3,虽然不检查,但也不保存错误的数据类型

删除数据

db.execSQL("delete from person where name = ?",new Object[]{"Lee"});

修改数据库

    public void update(){
        db.execSQL("update person set phone = ? where name = ?", new Object[]{"15877788889", "Mary"});
    }

查询数据库

    public void select(){
        Cursor cursor = db.rawQuery("select name, salary from person", null);

        while(cursor.moveToNext()){                 //移到下一行
            //取下一行的数据
            String name = cursor.getString(cursor.getColumnIndex("name"));  //通过列名获取列索引 
            String salary = cursor.getString(cursor.getColumnIndex("salary"));
            System.out.println(name + ":" + salary);
        }
    }

通过API来实现增删改查

插入

    public void insertApi(){

        //把要插入的数据全部封装到ContentValues中
        ContentValues values = new ContentValues();
        values.put("name", "Amy");
        values.put("phone", "15978787878");
        values.put("salary", "17000");
        //表名;字段控制,一般传null;封装插入的数据,键值对
        db.insert("person", null, values);
    }

删除

    public void deleteApi(){
        int i = db.delete("person", "name = ? and _id = ?", new String[]{"Lily", "6"}); //返回值是行数
        System.out.println(i);
    }

修改

    public void updateApi(){
        ContentValues values = new ContentValues();
        values.put("salary", 26000);
        db.update("person", values, "name = ?", new String[]{"Lily"});
    }

查询

db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
    public void selectApi(){
        //表名;列名,String[]{},所有字段是null;查询的where条件;占位符;分组;排序;分页查询
        db.query("person", null, null, null, null , null, null, null);
    }

事务

保证所有sql语句要么一起成功,要么一起失败

    public void transation(){
        try{
            //开启事务
            db.beginTransaction();
            ContentValues values = new ContentValues();
            values.put("salary", 13000);
            db.update("person", values, "name = ?", new String[]{"Lily"});

            //清空掉之前的数据,不清空容易把第一次的数据带过来
            values.clear();
            values.put("salary", 15000);
            db.update("person", values, "name = ?", new String[]{"Mary"});

            //设置事务执行成功
            db.setTransactionSuccessful();
        }
        finally{
            //关闭同时提交事务,如果已经设置事务执行成功,那么sql语句就会生效,否则就会回滚
            db.endTransaction();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值