SQLite数据库简介

SQLite是一个轻量级数据库,占用内存非常少,没有依赖第三方软件,这也是Android采用SQLite数据库的重要原因之一。
    SQLite是遵守ACID关联式的数据库管理系统,即数据库正确执行的4个基本要素:原子性(Atomicity)、一致性(Consistency)、
    隔离性(Isolation)、持久性(Durability)。这就保证了SQLite事务处理的安全性。
SQLite则会尝试将该值转换成该列的类型,如果不能转换,则将改值作为SQLite本身的数据类型存储,
例如varchar(n)、char(n)、decimal(p,s)等,在运算或者保存时会转换成对应的5种数据类型。这也是SQLite数据库的最大特点。

SQLite数据库的使用

为了方便使用SQLite数据库,AndroidSDK提供了一系列对数据库进行操作的类和接口,
1、SQLiteOpenHelper类 是一个抽象类,用于创建数据库和数据库版本的更新。一般是建立一个类继承它,并重写onCreate()和onUpgrade()方法。

/*在MainActivity类中调用OpenHelper*/
public class MainActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContextView(T.layout.activity_main);
    DBOpenHelper helper = new DBOpenHelper(MainActivity.this,"person.db");
    /*helper.getReadableDatabase();获取一个只读的数据库 只能查询 不能写入 不能更新*/
    SQLiteDatabase db = helper.getWritableDatabase();//获得一个可读可写的数据库
    }
}
public class DBOpenHelper extends SQLiteOpenHelper{
    /*public DBOpenHelper(Context context,String name,CursorFactory factory,int version){
    super(context,name,factory,version);
    }
    数据库的构造方法,用来定义数据库的名称,数据库查询的结果集,数据库的版本,context是当前类对象。
    */
    public DBOpenHelper(Context context,String name){
    super(context,name,null,1);
    }

    @Override/*首次创建数据库的时候调用,一般可以执行建库 建表的操作*/
    public void onCreate(SQLiteDatabase db){
    db.execSQL("create table person(id integer primary key autoincrement,"+
    "name varchar(20),"+
    "number varchar(20))"));
    }
    @Overrride/*当数据库的版本发生变化的时候会自动执行*/
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
    }
}

2、SQLiteDatabase类 是一个数据库访问类,该类封装了一系列数据库操作的API,可以对数据进行增删查改操作。
3、Cursor接口 是一个游标接口,在数据库操作中作为返回值,相当于结果集ResultSet。

/*在MainActivity类中调用SQLiteDatabase*/
public class MainActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContextView(T.layout.activity_main);
    /*每个程序都有自己的数据库 默认情况下是各自互不干扰 
    创建一个数据库 并且打开*/
    SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null);
    /*第一个参数是数据库名称,第二个参数是数据库权限,有APPEND、PRIVATE、READABLE、WRITABLE,第三个参数是实例化的查询游标*/ 
    //用SQL语句执行数据库操作
    db.execSQL("create table if not exists usertb("+
    "_id integer primary key autoincrement,"+
    "name text not null,"+
    "age integer not null,"+
    "sex text not null)");//id自增,且主键最好都定义为_id
    /*ContextValues类用于放置参数,类似map中的键值对形式*/
    ContentValues values = new ContentValues();
    values.put("name","John");
    values.put("sex","male");
    values.put("age","30");
    long rowId = db.insert("usertb",null,values);
    /*insert函数第一个参数是表名,最好是定义为final类型字符串,不容易出错第二个参数是默认值*/ 
    values.clear();
    values.put("name","Jack");
    values.put("sex","male");
    values.put("age","18");
    db.insert("usertb",null,values);//此时插入两组数据
    values.clear();
    values.put("age","33");
    db.update("usertb",values,"name=?",new String[]{"Jack"});
    //修改 将名字为Jack的年龄改成33,第三四个参数是修改的条件
    db.delete("usertb","name=?",new String[]{"Jack"});
    //删除 将名字为Jack的人的信息删除
    Cursor c = db.query("usertb",null,"id>?",new String[]{"0"},null,null,"name");
    /*查询 参数1:表名,参数2:查询的类名,参数3:查询的条件,参数4:查询参数值,参数5:分组条件,参数6:having条件,参数7:排序方式,返回结果为Cursor游标*/
    if(c!=null){
    String[] columns = c.getColumnNames();
    while(c.moveToNext()){
    for(String columnName:columns){
        Log.i("info",c.getString(c.getColumnIndex(columnName)));
        }
        }
    c.close();
    //在使用完Cursor对象时,一定要及时关闭,否则会造成内存泄漏
    }
    db.close();//关闭数据库
    }
}