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();//关闭数据库
}
}