SQLite
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
SQLite是基于文件的轻量级数据库,特别适合嵌入式设备。
该数据库存储于特定的应用程序目录下:
/data/data/<application package name>/databases/<databasename>
SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。
例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。
另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。
如下面语句会忽略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分标准SQL语句,如:
查询语句:
select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。
如: insert into person(name, age) values(‘传智’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。
如:update person set name=‘传智‘ where id=10
删除语句:delete from 表名 where 条件子句。
如:delete from person where id=10
使用SQLiteOpenHelper对数据库进行版本管理
在进行数据库操作的时候,我们需要一个创建一个类DatabaseHelper去继承助手类:SQLiteOpenHelper
使用它可以进行一些数据库表初始化的动作。
比如:创建数据库表结构,以及添加一些初始记录,在升级的时候,对数据库表结构进行更新等,它是通过对数据库版本进行管理来实现上面的需求。
DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能
第一:getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作
第二:提供了onCreate()和onUpgrade()两个回调函数,前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构
获取数据库操作实例
通过getWritable( )或者getReadable( ) 获得数据库实例对象后,通过ContentValues可以对数据进行insert和update
使用Cursor可以对数据进行查询
注意:
getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。
getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
数据库何时被创建
当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动 生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始数据
示例1
使用SQLiteDatabase专门提供的添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 对数据库进行操作
布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="createDatabase"
android:id="@+id/createDBbutton"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="updateDatabase"
android:id="@+id/updateDBbutton"
android:layout_below="@id/createDBbutton"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="insert"
android:id="@+id/insertButton"
android:layout_below="@id/updateDBbutton"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="update"
android:id="@+id/updateButton"
android:layout_below="@id/insertButton"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="query"
android:id="@+id/queryButton"
android:layout_below="@id/updateButton"
/>
</RelativeLayout>
数据库助手类DatabaseHelper
package com.example.mysqlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,
//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作
//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作
public class DatabaseHelper extends SQLiteOpenHelper{
private static final int VERSION = 1;
public DatabaseHelper(Context context,String name){
this(context,name,null,VERSION);
}
//在SQLiteOepnHelper的子类当中,必须有该构造函数
public DatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
//必须通过super调用父类当中的构造函数
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("create a Database");
//execSQL函数用于执行SQL语句
db.execSQL("create table user(id int,name varchar(20))");
}
//数据库文件的版本号在更新的时候调用,所以为了添加新的字段,要修改版本号
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
System.out.println("update a Database");
}
}
MainActivity
package com.example.mysqlite;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MySQLite extends Activity {
private Button updateDBbutton = null;
private Button createDBbutton = null;
private Button insertButton = null;
private Button queryButton = null;
private Button updateButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_sqlite);
updateDBbutton = (Button) findViewById(R.id.createDBbutton);
createDBbutton = (Button) findViewById(R.id.updateDBbutton);
insertButton = (Button)findViewById(R.id.insertButton);
updateButton = (Button)findViewById(R.id.updateButton);
queryButton = (Button)findViewById(R.id.queryButton);
createDBbutton.setOnClickListener(new createDBListener());
updateDBbutton.setOnClickListener(new updateDBListener());
insertButton.setOnClickListener(new insertListener());
updateButton.setOnClickListener(new updateListener());
queryButton.setOnClickListener(new queryListener());
}
private final class createDBListener implements OnClickListener{
public void onClick(View v) {
// TODO Auto-generated method stub
//创建一个DatabaseHelper对象
DatabaseHelper dbHelper = new DatabaseHelper(MySQLite.this,"test db");
//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();
}
}
private final class updateDBListener implements OnClickListener{
public void onClick(View v) {
DatabaseHelper dbHelper = new DatabaseHelper(MySQLite.this,"test_db",null,2);
SQLiteDatabase db = dbHelper.getReadableDatabase();
}
}
private final class insertListener implements OnClickListener{
public void onClick(View v) {
//生成ContentValues对象
ContentValues values = new ContentValues();
DatabaseHelper dbHelper = new DatabaseHelper(MySQLite.this, "test db ",null,2);
SQLiteDatabase db = dbHelper.getWritableDatabase();
//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致
values.put("id",1);
values.put("name", "zhangsan");
//调用insert方法,就可以讲数据插入到数据库当中
db.insert("user",null,values);
}
}
private final class updateListener implements OnClickListener{
public void onClick(View v) {
ContentValues values = new ContentValues();
DatabaseHelper dbHelper = new DatabaseHelper(MySQLite.this, "test db ");
SQLiteDatabase db = dbHelper.getWritableDatabase();
values.put("name", "newzhangsan");
//update(String table, ContentValues values, String whereClause, String[] whereArgs)
db.update("user",values,"id=?",new String[]{"1"});
}
}
private final class queryListener implements OnClickListener{
public void onClick(View v) {
DatabaseHelper dbHelper = new DatabaseHelper(MySQLite.this, "test db ");
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null,null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
System.out.println("query--->" + name);
}
}
}
}
示例2:使用execSQL()和rawQuery()方法完成增删改查操作
JavaBean
public class Person {
private String name ;
private String phone;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "Person [name=" + name + ", phone=" + phone + ", id=" + id + "]";
}
}
MainActivity
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取一个数据库帮助类
PersonDBOpenHelper helper = new PersonDBOpenHelper(this);
//创建数据库
helper.getWritableDatabase();
}
}
数据库帮助类
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class PersonDBOpenHelper extends SQLiteOpenHelper{
public PersonDBOpenHelper(Context context) {
super(context, "person.db",null , 1);
}
//创建数据库
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table person (id integer primary key autoincrement,name varchar(20) ,phone varchar(20))");
}
//进行版本更新
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.itxushuai.sqlite.PersonDBOpenHelper;
import com.itxushuai.sqlite.domain.Person;
public class PersonDao {
private PersonDBOpenHelper helper = null;
//任何对象使用dao层,都要传递一个上下文对象,方便获取资源
public PersonDao(Context context) {
helper = new PersonDBOpenHelper(context);
}
/**
* 添加一条记录
* */
public void add(String name,String phone){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("insert into person (name,phone) values (?,?)",new Object[]{name,phone});
db.close();
}
/**
* 更新一条记录
* @param name
* @param id
* */
public void update(String name,String phone,Integer id){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("update person set name=? ,phone=? where id=?",new Object[]{name,phone,id});
db.close();
}
/**
* 根据id删除一条记录
* @param id
* */
public void delete(Integer id){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("delete from person where id= ?",new Object[]{id});
db.close();
}
/**
* 根据姓名查找一条记录的id,没有的话,返回-1
* @param id
* @return
* */
public Integer find(String name){
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from person where id = ?", new String[]{name});
int id =-1;
if(cursor.moveToFirst()){
id = cursor.getInt(0);
return id;
}
db.close();
return id;
}
}
Mars视频与学习论坛:http://www.mars-droid.com/bbs/forum.php