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());
                    }