Android---Sqlite数据库---数据库查询两种方式(事务)

# 1 Android下数据库创建 
     mysql  sqlserver2005 oracle   sqlite : 轻量级,内置式
     数据库一般用于存储,大量具有结构相同的数据。

创建数据库的流程 :(SqliteOpenHelper:)
     1.创建一个帮助类,继承SqliteOpenHelper
          public class MyHelper extends SQLiteOpenHelper {)

     2.添加一个构造方法,用来指定数据库的名称和版本号
          //context: 上下文;  name:数据库文件的名称  factory:用于创建cursor对象,默认是null  
           version:数据库的版本号,从1开始,android4.0版本后只能升不能降

          public MyHelper(Context context) {
               super(context, "mydb.db", null, 2);
         }

     3.实现2个方法:
          onCreate:数据库第一次创建的时候会调用,特别适合做表结构的初始化
               public void onCreate(SQLiteDatabase db) {
                 //执行sql语句去做表结构的初始化,创建表,需要有一个SqliteDatabase对象
              db.execSQL("create table user (_id integer primary key autoincrement,name varchar(20))");
             }
          onUpgrade:数据库版本发生变化时调用该方法,该方法特别适合做表结构的修改
               public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                    //执行sql语句做表结构的修改   数据库版本也需要同时变更  才会起作用
                    db.execSQL("alter table user add phone varchar(20)");
                    //System.out.println("旧版本:" + oldVersion + "新版本+" + newVersion);
               }

 4.创建帮助类对象,并调用getReadableDatabase方法来创建或打开一个数据库。
           //1.创建一个数据库帮助类对象
               MyHelper mh = new MyHelper(this);
         //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
               SQLiteDatabase rdb = mh.getReadableDatabase();
package com.defineview.bill.mysqlitedemo.utils;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
* 自定义数据库帮助类
* Created by Bill on 2017/3/13.
*/

public class UserInfoOpenHelper extends SQLiteOpenHelper {

    public UserInfoOpenHelper(Context context) {
        super(context, "userInfo.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table user (_id integer primary key autoincrement  ,name varchar(20),phone varchar(20))");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        //执行sql语句做表结构的修改   数据库版本也需要同时变更  才会起作用
        // db.execSQL("alter table user add phone varchar(20)");

        //System.out.println("旧版本:" + oldVersion + "新版本+" + newVersion);
    }
}
    ☆☆getReadableDatabase()和getWritableDatabase()区别:
          getWritableDatabase( ):直接以读写的方式打开数据库,如果磁盘空间满了,就直接报错。
          getReadableDatabase( ):以读写方式打开数据库,如果磁盘空间满了,再以只读方式打开数据库。


# 2 Android下数据库第一种方式增删改查
     特点:通过帮助类得到一个数据库操作对象,执行execSql方法做增删改,执行rawQuery方法做查询,该种方式做增删改没      有返回值不能判断sql语句是否执行成功。 查询灵活可以做多表查询

     增删改查的流程:
          1.创建一个数据库帮助类对象
               mySqliteOpenHelper = new  UserInfoOpenHelper(context);

          2.调用帮助类对象的getReadableDatabas方法用来创建数据库
               db = mySqliteOpenHelper.getReadableDatabase();

          3.执行insert 对应的sql语句 的方法  sql:sql语句    bindArgs:占位符的参数值
               db.execSQL("insert into user (name,phone) values(?,?)", new Object[]{bean.name,bean.phone});

               查询方法****:
                    public void query(){
                    //创建集合 存放结果集
                    ArrayList list = new ArrayList();
                    //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
                    rdb = mh.getReadableDatabase();
                    //3.执行select 对应的sql语句 的方法  sql:sql语句    selectionArgs:占位符的参数值    返回结果集
                    Cursor cursor = rdb.rawQuery("select * from user", null);
                    //4.解析结果集
if(cursor!=null && cursor.getCount()>0){
                              while(cursor.moveToNext()){//游标是否向下移动
                                   UserBean user = new UserBean();
                                   user.name=cursor.getString(cursor.getColumnIndex("name"));
                                   user.phone=cursor.getString(cursor.getColumnIndex("phone"));
                                   System.out.println("name:"+ user.name + "phone:" + user.phone);
                                   list.add(user);
                              }
                              //关闭cursor
                              cursor.close();
                         }
                    //5.关闭数据库
                    rdb.close();
                    }

          4.关闭数据库
               db.close();

代码如下;
package com.defineview.bill.mysqlitedemo.utils;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.defineview.bill.mysqlitedemo.model.UserBean;

import java.util.ArrayList;

/**
* Created by Bill on 2017/3/18.
*/

public class UserInfoDbUtils {

    private SQLiteDatabase db;
    private UserInfoOpenHelper mySqliteOpenHelper;

    public UserInfoDbUtils(Context context) {
        //1.创建一个数据库帮助类对象
        mySqliteOpenHelper = new UserInfoOpenHelper(context);
    }

    public void add(UserBean bean) {

        //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
        db = mySqliteOpenHelper.getReadableDatabase();

        //3.执行insert 对应的sql语句 的方法  sql:sql语句    bindArgs:占位符的参数值
        db.execSQL("insert into user (name,phone) values(?,?)", new Object[]{bean.name, bean.phone});
        //4.关闭数据库
        db.close();
    }

    public void delete(String name) {

        //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
        db = mySqliteOpenHelper.getReadableDatabase();

        //3.执行delete 对应的sql语句 的方法  sql:sql语句    bindArgs:占位符的参数值
        db.execSQL("delete from user where name=?;", new Object[]{name});
        //4.关闭数据库
        db.close();
    }

    public void update(UserBean bean) {

        //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
        db = mySqliteOpenHelper.getReadableDatabase();
        //3.执行update 对应的sql语句 的方法  sql:sql语句    bindArgs:占位符的参数值
        db.execSQL("update user set phone=? where name=?;", new Object[]{bean.phone, bean.name});

        //4.关闭数据库
        db.close();
    }

    /**
     * 查询
     */
    public void query() {

        //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
        db = mySqliteOpenHelper.getReadableDatabase();


        ArrayList list = new ArrayList();

        //3.执行select 对应的sql语句 的方法  sql:sql语句    selectionArgs:占位符的参数值
        Cursor cursor = db.rawQuery("select * from user", null);

        //4.解析结果集
        //判断结果集是否有效
        if (cursor != null && cursor.getCount() > 0) {

            while (cursor.moveToNext()) {//游标是否继续向下移动
                UserBean bean = new UserBean();
                //通过列的索引获取对应的数据
                bean.name = cursor.getString(cursor.getColumnIndex("name"));
                bean.phone = cursor.getString(cursor.getColumnIndex("phone"));

                System.out.println("name:" + bean.name + " phone:" + bean.phone);

                list.add(bean);
            }
            //关闭cursor
            cursor.close();
        }
        //5.关闭数据库
        db.close();
    }

}


# 3 Android下另外一种增删改查方式 

     特点:通过调用SqliteDatabase对象的insert,update ,delete   ,query方法做增删改查,执行结果有了返回值,我们可以根据返回值判断sql是否执行成功。
     查询不够灵活,不能做多表查询

     增删改查的流程:
          1.创建一个数据库帮助类对象
               mySqliteOpenHelper = new  UserInfoOpenHelper(context);
          2.调用帮助类对象的getReadableDatabas方法用来创建数据库
               db = mySqliteOpenHelper.getReadableDatabase();
          3.执行db.insert();db.delete();db.update();db.query()
  //***创建查询的方法
               public void query(){
                    //创建集合 存放结果集
                         ArrayList list = new ArrayList();
                    //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
                         rdb = mh.getReadableDatabase();
                    //3.//columns:查询的列,如果查询所有传null  selection:查询条件       selectionArgs:条件占位符的参数值  groupBy:分组 having:分组条件   orderBy:按什么排序
                         Cursor cursor = rdb.query("user", new String[]{"name","phone"}, "name=?", new String[]{"zhangsan"}, null, null, "_id desc");
                    //4.解析结果集
                         if(cursor!=null && cursor.getCount()>0){
                              while(cursor.moveToNext()){//游标是否向下移动
                                   UserBean user = new UserBean();
                                   user.name=cursor.getString(cursor.getColumnIndex("name"));
                                   user.phone=cursor.getString(cursor.getColumnIndex("phone"));

                                   System.out.println("name:"+ user.name + "phone:" + user.phone);
                                   list.add(user);
                              }
                              //关闭cursor
                                cursor.close();
                         }
                    //5.关闭数据库
                         rdb.close();
               }

          4.关闭数据库
               db.close();
package com.defineview.bill.mysqlitedemo.utils;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.defineview.bill.mysqlitedemo.model.UserBean2;

import java.util.ArrayList;

public class UserInfoDbUtils2 {

    private SQLiteDatabase db;
    private UserInfoOpenHelper2 mySqliteOpenHelper;

    public UserInfoDbUtils2(Context context) {
        //1.创建一个数据库帮助类对象
        mySqliteOpenHelper = new UserInfoOpenHelper2(context);
    }

    public boolean add(UserBean2 bean) {
        //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
        db = mySqliteOpenHelper.getReadableDatabase();
        //3.执行insert 对应的sql语句 的方法  sql:sql语句    bindArgs:占位符的参数值

        ContentValues values = new ContentValues();
        //key:表中字段的名称 
        values.put("name", bean.name);
        values.put("phone", bean.phone);
        //table:表名   nullColumnHack:可以为null   values:添加哪些列的数据  return :新添加这一条数据行的id,如果返回-1代表添加失败
        long result = db.insert("user2", null, values);//底层是在拼装sql语句
        //4.关闭数据库
        db.close();

        if (result == -1) {
            return false;
        }

        return true;
    }

    public int delete(String name) {
        //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
        db = mySqliteOpenHelper.getReadableDatabase();

        //3.执行delete 对应的sql语句 的方法  sql:sql语句    bindArgs:占位符的参数值
        //whereClause:删除条件  whereArgs:条件中占位符的值  返回值:成功删除多少行
        int delete = db.delete("user2", "name=?", new String[]{name});

        //4.关闭数据库
        db.close();
        return delete;
    }

    public int update(UserBean2 bean) {
        //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
        db = mySqliteOpenHelper.getReadableDatabase();
        //3.执行update 对应的sql语句 的方法  sql:sql语句    bindArgs:占位符的参数值

        ContentValues values = new ContentValues();
        values.put("phone", bean.phone);

        //values:更新的列的数据   whereClause:更新条件 whereArgs:条件中占位符的值     返回值:成功修改多少行
        int update = db.update("user2", values, "name=?", new String[]{bean.name});
        //4.关闭数据库
        db.close();
        return update;
    }

    public void query() {
        ArrayList list = new ArrayList();
        //2.调用帮助类对象的getReadableDatabas方法用来创建数据库
        db = mySqliteOpenHelper.getReadableDatabase();
        //3.执行select 对应的sql语句 的方法  sql:sql语句    selectionArgs:占位符的参数值
//    Cursor cursor = db.rawQuery("select * from user", null);

        //columns:查询的列,如果查询所有传null  selection:查询条件  selectionArgs:条件占位符的参数值  groupBy:分组 having:分组条件   orderBy:按什么排序
        Cursor cursor = db.query("user2", new String[]{"name", "phone"}, "name = ?", new String[]{"王五"}, null, null, "_id desc");
        //4.解析结果集
        //判断结果集是否有效
        if (cursor != null && cursor.getCount() > 0) {

            while (cursor.moveToNext()) {//游标是否继续向下移动
                UserBean2 bean = new UserBean2();
                //通过列的索引获取对应的数据
                bean.name = cursor.getString(cursor.getColumnIndex("name"));
                bean.phone = cursor.getString(cursor.getColumnIndex("phone"));
                System.out.println("name:" + bean.name + " phone:" + bean.phone);
                list.add(bean);
            }
            //关闭cursor
            cursor.close();
        }
        //5.关闭数据库
        db.close();
    }
}


# 4 数据库的事务 
          事务:执行多条sql语句要么同时成功,要么同时失败。事务可以保证你的操作具有原子性,一致性

     银行转账:
          public void transferAccounts(View v){
               //1.创建帮助类对象
               BankOpenHelper bankOpenHelper = new BankOpenHelper(this);
               //2.调用getReadableDatabase方法
               SQLiteDatabase db = bankOpenHelper.getReadableDatabase();
               //开启事务
               db.beginTransaction();
               try {
                    //3.转账sql
                    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();
               } finally {
                    //结束事务,会判断事务是否执行成功,如果所有sql执行成功,提交sql语句更改数据库,如果有一条sql没有执行,回滚之前执行过的sql语句。
                    db.endTransaction();
               }
               db.close();
          }     

cmd命令:
     adb shell进入手机linux下,找到数据库文件后可以使用sqlite3指令打开一个数据库,执行sql语句。
    例如: adb shell
            cd data/data/com.itheima.taransction/databases
             ls -l
             sqlite3 bank.db
             select * from table;   即可参看数据

PS:
     cursor:结果集
     _id  integer (安卓中没有int)
    安卓4.0以后数据库版本只能升,不能降
    一个数据库,对应一个帮助类文件
     类名.this代表此类的一个对象

你可能感兴趣的:(Android学习)