SQLite 是一个轻量级的数据库,支持SQL正规的SQL语句,可以存储大量数据。
建立SQLite数据库,要使用Android提供的一个SQLiteOpenHelper帮助类,需要新建一个类去继承SQLiteOpenHelper类,重写里面的两个抽象方法,OnCreate()和OnUpgrade(),还要重写有产构造方法,
有参构造重写四个参数的,第一个参数是上下文,第二个是数据库名称,第三个是游标Cursor,通常给值null,第四个是当亲数据库的版本号。
public 重写方法(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); MyDatabaseHelper.this.context = context; }
onCreate()方法,调用SQLiteDatabase 对象的execSQL()方法,里面的参数是建表的SQL语句,
private String sql = "create table Book(" +"id integer primary Key autoincrement," +"author text," +"price real," +"pages integer," +"name text)";
@Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL(sql); }
然后在主活动中new一个继承SQLiteOpenHelper类的对象,并且调用getWritableDatabase()或getReadableDatabase()方法。这两者都可以创建一个数据库,或者数据库存在就直接打开,但是当数据库不可写入的时候,getReaderDatabase()方法会以只读的方式打开数据库,getWritableDatabase()方法则会出现异常。
在创建数据库的时候调用的getReaderDatabase() 或getWritableDatabase()会返回一个SQLiteDatabase对象,利用该对象调用相应的方法完成数据的增删改查
增加数据:
可以分为两种方式:
1:new一个ContentValues,该对象提供Put()方法,数据以键值对的形式储存,SQLiteDatabase对象 ,提供一个insert()方法,它接受三个参数,第一是表名,第二是在未给指定列赋值时,默认为null,第三就是ContentValues对象。
2:就是调用SQLiteDatabase对象 的execSQL()方法,里面传值SQL语句。
/* ContentValues values = new ContentValues(); values.put("author","周生磊"); values.put("price",22); values.put("pages",33); values.put("name","android"); db.insert("Book",null,values); values.clear();*/ db.execSQL("insert into Book(author,price,pages,name) values(?,?,?,?)",new String[]{"周生磊","22","33","android"});
删除数据:
1.同上调用delete()方法。第一个参数表名,第二个限定条件,第三个限定条件的值。
2:同上
/* db.delete("book","name=?",new String[]{"android"});*/ db.execSQL("delete from book where name = ?",new String[]{"android"});
修改数据:
1:同上,new 一个ContentValues对象,用来存放数据,SQLiteDatabase对象调用updata()方法,传入四个参数,第一个表名,第二个需要修改的数据,第三个限定符,表示要修改哪一行等待传值,第四个传值具体修改哪几行。
2:SQLiteDatabase对象的execSQL()方法,写入SQL语句。
/*ContentValues values1 = new ContentValues(); values1.put("price",5435); db.update("book",values1,"name=?",new String[]{"android"});*/ db.execSQL("update Book set price = ? where name =?",new String[]{"4533","android"});
查询数据:最复杂的
1:查询数据需要调用rawQuery()方法,该方法返回值是一个Cursor(游标),利用Cursor遍历查询结果,首先确认cursor是否为空,调用cursor.moveToFirst(),该方法移动Cursor到第一行,如果为空就返回False,否则就是true,在进行循环进行遍历,利用Cursor.GetString(),方法得到该列的具体参数,看到下面代码很多人会疑问,为什么不在.GetString(),方法内直接传入列名,而是又调用了一个Cursor.GetColumnIndex()呢?那是应为.GetString()方法内只接受Int类型的值,而.GetColumnIndex(),接受String值,返回int值,而GetColumnIndex()方法返回的int值是该列的下标,所以利用返回值得相互转变得到我们想要的数据值。简直完美,不是吗?
2:调用的是RawQuery()方法,而不是execSQL()方法,里面写入SQL语句,查询全部则第二个限定参数为null,第二个参数类型为new String[]{}类型,用法同上一样,SQL语句?限定,new String[]{}里面给‘?‘赋值。
/*Cursor cursor = db.query("book",null,null,null,null,null,null);*/ Cursor cursor = db.rawQuery("select * from Book",null); if (cursor.moveToFirst()){ do { //遍历Cursor对象,并打印 String author = cursor.getString(cursor.getColumnIndex("author")); int price = cursor.getInt(cursor.getColumnIndex("price")); int pages = cursor.getInt(cursor.getColumnIndex("pages")); String name = cursor.getString(cursor.getColumnIndex("name")); String show = "author:"+author+",price:"+price+",pages:"+pages+",name:"+name; et_show.setText(show); }while (cursor.moveToNext()); }