SQLite的基本使用

SQLite的基本使用

  • SQLite数据库的基本使用就是增删改查(CURD)。
    Android提供了一个SQLiteOpenHelper== 抽象类让我们更加方便的管理数据库,
    SQLiteOpenHelper就是“数据库打开帮助者”,既然是抽象类,
    就意味着要创建一个类去继承它。SQLiteOpenHelper有两个抽象方法,分别是onCreate()onUpgrade(),我们必须在自己创建的类中重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。
  • 这是自己创建的帮助类 ,让他去继承SQLiteOpenHelper并重写onCreate()和onUpgrade()方法。SQLiteOpenHelper中有两个构造方法,一般使用参数较少的那个构造方法。这个构造方法接收四个参数,分别是(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) ,第一个参数context就是上下文对象,第二个参数name是你需要创建的数据库的名字,第三个参数允许我们在查询数据的时候返回一个cursor对象,这个参数一般传入null,第四个参数version是数据库的版本号。
public class DBHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK = "create table Book("
            +"id integer primary key autoincrement,"
            +"author text,"
            +"price real,"
            +"pages integer,"+"name text)";
    private Context context;
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.context = context;
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        Log.d("111","数据库创建成功");
    }

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

    }
}
  • SQLiteOpenHelper中还有两个非常重要的方法,分别是getReadableDatabase()getWritableDatabase。这两个方法都可以创建或打开一个现有的数据库(如果数据库已经存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的(Database)类对象。
  • 帮助类DBHelper类完成重写以后,接下来就是去主类里边获得可读写的数据库对象。
DBHelper helper = new DBHelper(this,"stu.db",null,1);
SQLiteDatabase db = helper.getWritableDatabase();

这里咱们直接获取到可读写的数据库对象db,接下来的CURD,全通过db的方法来实现。

增加数据
  • 方法一
			ContentValues values = new ContentValues();
                values.put("name","第一行代码");
                values.put("id",1);
                values.put("author","郭霖");
                values.put("price",16.96);
                values.put("pages",500);
                db.insert("Book",null,values);
                values.clear();
                db.close();
                Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
  • 方法二
				db.execSQL("insert into Book (name,author,pages,price)values(?,?,?,?)",
 				new String[]{"第二行代码","郭霖二号 ","188","15.999"});
删除数据
  • 方法一
				db.delete("Book","pages>?",new String[]{"200"});
  • 方法二
				db.execSQL("delete from Book where id = 1");
更新数据
  • 方法一
				ContentValues valu = new ContentValues();
                valu.put("price",11.11);
                db.update("Book",valu,"name = ?",new String[]{"第一行代码"});
  • 方法二
	db.execSQL("update Book set price = ? where name = ?",new String[] {"100.23","第一行代码"});
查询数据
  • 方法一
				Cursor cursor = db.query("Book",null,null,null,null,null,null);

Database的query()方法的参数很复杂,最短的一个方法重载也需要传入7个参数。七个参数分别是:

String table, String[] columns,String selection, String[] selectionArgs, String groupBy,
            String having, String orderBy

第一个参数不用多说,是表名,表示我们希望从哪张表中查询数据。第二个参数用于指定去查询那几列,如果不指定则查询所有列;第三、第四个参数用于约束查询某一行或者某几行的数据,不指定则默认查询所有行的数据;第五个参数用于指定需要去groupBy的列,不指定则不对查询结果进行groupBy操作;第六个参数用于对groupBy进行进一步的过滤,不指定则表示不过滤;第七个参数用于指定查询结果的排序方式,不指定则表示使用默认是排序方式。

query()方法返回的一个是Cursor对象,接着我们调用cursor的moveToFirst()方法将数据的指针移动到第一行的位置,然后进入到一个循环当中,去遍历查询每一行的数据。在这个循环中可以通过Cursor的getColumnIndex()方法获取某一列在表中对应的位置索引,然后将这个索引传入到相应的取值方法中,就可以得到从数据库中读取到的数据了。

  if (cursor.moveToFirst()){
                    do {
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String author = cursor.getString(cursor.getColumnIndex("author"));
                        int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                        double price = cursor.getDouble(cursor.getColumnIndex("price"));
                        Log.d("----------------","书名是"+name+",作者是"+author+",页数是"+pages+",价钱是"+price);
                    }while (cursor.moveToNext());
						
                }
                cursor.close();
  • 方法二
	 				Cursor cursor = db.rawQuery("select * from Book",null);

得到Cursor对象以后,接下来的操作和方法一中的步骤相同。

数据库的升级

细心的同学已经发现了在SQLiteOpenHelper的两个重要的抽象方法中,咱们只在onCreate()方法中写了代码,而onUpgrade()中什么也没有。这个方法是用来对数据库进行升级的。 因为在创建数据库的时候,onCreate()方法只会执行一次。简单来说就是在你创建成功数据库后,运行程序,点击按钮,只有第一次点击会打印出“数据库创建成功”,再点击的话,将没有任何反应,这是因为你在第二次及之后点击的时候,数据库已经存在,不管我们怎么点击,onCreate()方法都不会再次执行。 所以,当我们想创建第二张表的时候,就遇到了麻烦:创建表的语句是写在onCreate()方法里边的,但是onCreate()不会重复执行。 解决这个问题的办法也相当简单,只需要将程序卸载掉,然后重新运行,就可以了。但是,通过卸载程序的方式来新增一张表无疑是非常极端的做法。 其实我们只需要巧妙地运用SQLiteOpenHelper的升级功能就可以很轻松地解决这个问题。在onUpgrade()方法中填写如下代码即可:

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
				db.execSQL("drop table if exits Book");
				onCreate(db);
    }

我们在onUpgrade()方法中执行了DROP语句,意思就是如果发现数据表已经存在,就将他删除,然后重新执行onCreate()方法,就可以重新创建。这里先将存在的表删除,因为如果在创建表的时候发现这张表已经存在了,就会直接报错。
接下来就是让onUpgrade()方法执行,还记得SQLiteOpenHelper的构造方法吗,他的第四个参数version是数据库的版本号,之前我们传入的版本号是1,在接下来实列化对象时,只需要把参数改成一个比1大的数,onUpgrade()方法就会得到执行。

这些只是SQLite最基本的用法,更深入更简单的方法,需要同学们去探索。此篇文章属个人在学习路上的“学习笔记”,如有错误,请联系我修改,不胜感激!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值