Android数据库入门

数据库的创建
1.写一个类继承SQLiteOpenHelper(构造,onCreate,onUpgrade)
/**
 *数据库的帮助类
 *要创建数据库操作的对象,必须借助帮助类对象
 */
public class MyHelper extends SQLiteOpenHelper {
    public MyHelper(Context context, String name, CursorFactory factory,
            int version) {
        super(context,// 数据库帮助类要依赖的上下文对象
                name,// 数据库文件的名字(不是表名)数据库的名字,后缀名可加可不加
                factory,// 游标工厂,用来创建数据,一般为空
                version);// 数据库的版本号,从1开始
    }
    @Override
    /**
    *在第一次 创建数据库的调用,在此方法中一般用于创建表和初始化表中的数据
    *db:数据库的操作对象
    */
    public void onCreate(SQLiteDatabase db) {
        String sqlcreate="create table student (_id integer primary key autoincrement," +
                " name varchar(20)," +
                "age integer) ";
        db.execSQL(sqlcreate);
    }
    @Override
    /**
     * 数据库版本升级的时候调用
     * db:数据库操作的对象
     * oldVersion:数据库的旧版本号
     * newVersion: 数据库的新版本号
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion>oldVersion) {
            // 删除旧表,创建新表
            db.execSQL("drop table if exists student ");
            onCreate(db);
        }
    }
}
2.获取到一个数据库的操作对象
    // 版本号不能降低,只能增加,可以跳跃增加
    helper=new MyHelper(this, DB_NAME, null, 2);
    // 获取到一个可读可写的数据库对象,得到数据对象的时候就会去调用Helper中的部分方法,若磁盘空间满,会产生异常
    db=helper.getWritableDatabase();
    // 获取到的也是一个可读可写的数据库对象,但在特殊情况下eg:磁盘空间满了,该数据库对象变成只读的了
    db=helper.getReadableDatabase();
数据库的第一种增删改查(使用SQL语句)
public class MainActivity extends Activity {
    private SQLiteDatabase db;
    private MyHelper helper;
    private static final String DB_NAME="first.db";//数据库的名字,后缀名可加可不加
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=(TextView) findViewById(R.id.textview);
        // 版本号不能降低,只能增加,可以跳跃增加
        helper=new MyHelper(this, DB_NAME, null, 2);
        // 获取到一个可读可写的数据库对象
        db=helper.getWritableDatabase();
        // 获取到的也是一个可读可写的数据库对象,但在特殊情况下eg:磁盘空间满了,该数据库对象变成只读的了
        db=helper.getReadableDatabase();

//      insertData();
//      deleteData();
//      updateData();
        selectData();

    }
    /**
     * 插入数据
     */
    public void insertData(){
        String sql="insert into student( name,age) values ('name1',18)";
        db.execSQL(sql);
        // 推荐使用
        db.execSQL("insert into student( name,age) values (?,?)", new Object[]{"name2",19});
    }
    /**
     * 删除数据
     */
    public void deleteData(){// 下面的三条语句等效
        db.execSQL("delete from student where _id = 2");
//      db.execSQL("delete from student where _id = ? ", new Object[]{2});
//      db.execSQL("delete from student where _id = 2", null);
    }
//  修改数据
    public void updateData(){
        db.execSQL("update student set name='qqq',age=25 where _id=3 ");
        db.execSQL("update student set name= ? ,age= ? where _id= ? ",new Object[]{"www",29,4});
    }

//  查询数据
    public void selectData(){
        Cursor cursor = db.rawQuery("select name,age from student ",null);
       // Cursor cursor = db.rawQuery("select name,age from student where age= ?",new String[]{"25"});
        //cursor.moveToNext(): 让游标依次向下一行移动,如果下一行有数据返回true,没有数据返回false
        while(cursor.moveToNext()){
            /*查询方式一:
             * //根据查询出一行里面name所在的列号(从0开始一次增加),列号与查询的字段相对应
            String name = cursor.getString(0);
            int age=cursor.getInt(1);
            textView.append(name+"="+age);*/

            //查询方式二:
            //根据列名获取到列号,后续的就不用改变,推荐使用
            int nameIndex = cursor.getColumnIndex("name");
            int ageIndex = cursor.getColumnIndex("age");
            String name = cursor.getString(nameIndex);
            int age=cursor.getInt(ageIndex);
        }
    }

数据库的第二种增删改查(使用Android的方法)
建表语句
db.execSQL("create table food (_id integer primary key autoincrement," +
                "name varchar ," +
                "price varchar(10))");
   插入数据
    private void insertApi(){
         /*
          * 参数解释insert(table, nullColumnHack, values)==>()
          * table:表名
          * nullColumnHack:没有插入字段的默认值
          * values:要添加的数据,ContentValues的对象,通过put放数据,键为字段名,值为插入值
          * 返回值:插入数据的行号id,返回-1表插入数据失败
          * */

        for (int i = 0; i < 20; i++) {
            ContentValues values=new ContentValues();
            values.put("name", "apple"+i);
            values.put("price", "5.5"+i);
            long rowId = db.insert(TABLE_NAME, null, values);
            if (rowId==-1) {
                Log.e("info", "插入数据失败==="+i);
            }
        }
    }
删除数据
    private void delectApi() {
        /*
         * db.delete(table, whereClause, whereArgs)
         * table: 表名
         * whereClause: sql语句中的where后面的赛选条件(不写关键字where)
         * whereArgs:   如果赛选条件有?,这就是赛选条件的具体值
         * 返回值:删除的行数,若等于0,表示删除失败
         * 注:如果没有where赛选条件whereClause和whereArgs为 null
         * */
        //db.execSQL("delete from table food where name =? ",new String[]{"apple1"});等价
        int rows = db.delete(TABLE_NAME, "name = ? ", new String[]{"apple1"});
        if (rows>0) {
            Toast.makeText(this, "删除成功,共删除"+rows+"条数据!", 1).show();
        }else {
            Toast.makeText(this, "删除失败", 1).show();
        }

    }
修改数据
    private void updataApi(){
        /*如果没有赛选条件,最后两个可以填 null
         * db.update(table, values, whereClause, whereArgs);
         * table:表名
         * values:  要修改的数据,ContentValues的对象,通过put放数据,键为字段名,值为插入值
         * whereClause: sql语句中的where后面的赛选条件(不写关键字where)
         * whereArgs:   如果赛选条件有?,这就是赛选条件的具体值,为String 的数组
         * 返回值:  修改数据受影响的行数,
         * */
//      db.execSQL("update food set price =100.0 where _id =15 ");
        ContentValues values=new ContentValues();
        values.put("price", "100.0");
        int rows = db.update(TABLE_NAME, values, " _id = ? ", new String[]{"15"});
        if (rows>0) {
            Toast.makeText(this, "修改成功,共修改"+rows+"条数据!", 1).show();
        }else {
            Toast.makeText(this, "没有修改到数据", 1).show();
        }
    }
查询数据
    private void selectApi() {
        /*sql="select name,price from food where name = apple1 "
         * db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
         * table:   表名
         * columns: 要查询的字段,String的数组
         * selection:   赛选条件的where语句(不写关键字where了)
         * selectionArgs:   如果赛选条件有,这里为赛选条件的值
         * 以下三个参数没有就填null
         * groupBy:  分组
         * having:   分组的条件
         * orderBy:   排序方式
         * */

    /*sql=" select name,price,_id from limit "0,10" "
     db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, 
     limit);分页查询使用,eg: "1,10"  1:代表开始查询的位置,10:查询的数量,结果就是从1位置开始查询,查询出10条数据
* */
        cursor=db.query(TABLE_NAME,
                   new String[]{"name","price","_id"},null, null, null, null, null, "0,20");
        Cursor cursor = db.query(TABLE_NAME,new String[]{"name","price","_id"},
                "name=?", new String[]{"apple2"}, null, null, null);
        //  相当于  select * from food
        cursor = db.query(TABLE_NAME,new String[]{"name","price","_id"},
                null, null, null, null, null);
        while(cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String price = cursor.getString(cursor.getColumnIndex("price"));
            int id = cursor.getInt(cursor.getColumnIndex("_id"));
            textView.append(name+",="+price+",="+id+"=======\n");
        }
    }
分页查询
/*sql=" select name,price,_id from limit "0,10" "
     db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, 
     limit);分页查询使用,eg: "1,10"  1:代表开始查询的位置,10:查询的数量,结果就是从1位置开始查询,查询出10条数据
* */
        cursor=db.query(TABLE_NAME,
                   new String[]{"name","price","_id"},null, null, null, null, null, "0,20");
数据库适配器SimpleCursorAdapter
      /*数据的适配器,不用创建java bean对象,不用自定义适配器
         * new SimpleCursorAdapter(context, 上下文
         * layout:  每个item要展示的布局文件
         * c:   数据源,查询数据库的时候得到的cursor游标
         * from:    数据获取的来源,表的字段数组
         * to:      数据的去处,item布局的控件id的数组
         * flags:   标记,
           标记有CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER : 2 和 CursorAdapter.FLAG_AUTO_REQUERY : 1
         * 交换数据源,可以换新的数据源:simpleCursorAdapter.swapCursor(cursor);
         * )*/
        simpleCursorAdapter=new SimpleCursorAdapter(this,
                R.layout.item,
                null, new String[]{"_id","name","price"}, 
                new int[]{R.id.item_id,R.id.item_name,R.id.item_price},
                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        listView.setAdapter(simpleCursorAdapter);
        // 交换数据源,可以换新的数据源
        //simpleCursorAdapter.swapCursor(cursor);
        simpleCursorAdapter.changeCursor(cursor);//也是交换数据源,会自动关闭老的cursor,推荐使用

Cursor类
    getColumnCount():获取到查询后表中的字段列数
    getCount():行数
    getColumnIndex(String columnName):获取到指定字段名的下标位置
    getColumnName(int columnIndex):根据列号得到列名
    getType(int columnIndex)    :得到指定列数的类型
        FIELD_TYPE_NULL        :null
        FIELD_TYPE_INTEGER    :integer
        FIELD_TYPE_FLOAT        :float
        FIELD_TYPE_STRING        :string
        FIELD_TYPE_BLOB        :blob
    getLong(int columnIndex)    :得到指定列号的long数据
    getString(int columnIndex)    :得到指定列号的string数据
    isNull(int columnIndex)    :判断指定列号是否为null
    boolean moveToNext()    :移动游标到下一行,若下行有数据返回true
数据库事务
4 数据库的事务    
    事务: 执行多条sql语句,要么同时执行成功,要么同时执行失败,不能有的成功,有的失败
    银行转账
    //点击按钮执行该方法
    public void transtation(View v){
        //1.创建一个帮助类的对象
        BankOpenHelper bankOpenHelper = new BankOpenHelper(this);
        //2.调用数据库帮助类对象的getReadableDatabase创建数据库,初始化表数据,获取一个SqliteDatabase对象去做转账(sql语句)
        SQLiteDatabase db = bankOpenHelper.getReadableDatabase();
        //3.转账,将李四的钱减200,张三加200
        db.beginTransaction();//开启一个数据库事务
        try {
            db.execSQL("update account set money= money-200 where name=?",new String[]{"李四"});
            int i = 100/0;//模拟一个异常
            db.execSQL("update account set money= money+200 where name=?",new String[]{"张三"});
            db.setTransactionSuccessful();//标记事务中的sql语句全部成功执行
        } finally {
            db.endTransaction();//判断事务的标记是否成功,如果不成功,回滚错误之前执行的sql语句 
        }
    }















  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值