Android专门提供了一个 SQLiteOpenHelper帮助类对数据库进行创建和升级
SQLiteOpenHelper需要创建一个自己的帮助类去继承它并且重写它的两个抽象方法,即 onCreate() 和 onUpgrade()
SQLiteOpenHelper 中有两个重要的实例方法:getReadableDatabase() 和 getWritableDatabase()
创建一个名为 BookStore.db 的数据库
在这个数据库中新建一张 book表,表中有 id(主键)、作者、价格、页数和书名等列
新建 MyDatabaseHelper类继承自 SQLiteOpenHelper,代码如下:
public class MyDatabaseHelper extends SQLiteOpenHelper {
// Book表的建表语句
private static final String CREATE_BOOK = "create table book("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)";
private Context mContext;
/**
* 构造方法
* @param context
* @param name 数据库名
* @param factory 允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null
* @param version 当前数据库的版本号,可用于对数据库进行升级操作
*/
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
/**
* 创建数据库
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
// 执行建表语句
db.execSQL(CREATE_BOOK);
ToastUtils.showShort("创建成功");
}
/**
* 升级数据库
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
修改布局 activity_sqlite.xml 中代码,添加个按钮来创建数据库:
修改 activity 中的代码:
public class SQLiteActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
// 构建MyDatabaseHelper对象,指定数据库名为"BookStore.db、版本号为1
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
Button btn_create_database = (Button) findViewById(R.id.btn_create_database);
btn_create_database.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 创建或打开一个现有的数据库(已存在则打开,否则创建一个新的)
dbHelper.getWritableDatabase();
}
});
}
}
第一次点击按钮时,会检测到当前程序中并没有 BookStore.db 这个数据库,
于是会创建该数据库并调用 MyDatabaseHelper中的 onCreate()方法,创建 book 表,
然后弹出一个 Toast 提示创建成功。再次点击按钮时,会发现此时已存在 BookStore.db 数据库了,
因此不会再创建一次。
MyDatabaseHelper 中的onUpgrade() 方法是用于对数据库进行升级
项目中已经有一张 book 表用于存放书的各种详细数据,
若我们想再添加一张 category 表用于记录书籍的分类该怎么做?
修改 MyDatabaseHelper 中的代码,如下:
public class MyDatabaseHelper extends SQLiteOpenHelper {
// Book表的建表语句
private static final String CREATE_BOOK = "create table book("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)";
// Category表的建表语句
private static final String CREATE_CATEGORY = "create table category("
+"id integer primary key autoincrement,"
+"category_name text,"
+"category_code integer)";
private Context mContext;
/**
* 构造方法
* @param context
* @param name 数据库名
* @param factory 允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null
* @param version 当前数据库的版本号,可用于对数据库进行升级操作
*/
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
/**
* 创建数据库
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
// 执行建表语句
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
ToastUtils.showShort("创建成功");
}
/**
* 升级数据库
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 若发现数据库中已存在 book 表或 category 表,将这两张表删除掉
db.execSQL("drop table if exists book");
db.execSQL("drop table if exists category");
// 重新创建表
onCreate(db);
}
}
修改 activity 中的代码,
在 SQLiteOpenHelper 的构造方法里接收的第四个参数传入一个比之前传入的版本号 1 大的数,
就可以让 onUpgrade()方法得到执行了。
如下
public class SQLiteActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
// 构建MyDatabaseHelper对象,指定数据库名为"BookStore.db、版本号为1
//dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
// 将数据库版本号指定为2
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
Button btn_create_database = (Button) findViewById(R.id.btn_create_database);
btn_create_database.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 创建或打开一个现有的数据库(已存在则打开,否则创建一个新的)
dbHelper.getWritableDatabase();
}
});
}
}
CRUD:添加(Create),查询(Retrieve),更新(Update),删除(Delete)
SQLiteOpenHelper 中的 getReadableDatabase() 或 getWritableDatabase() 方法都会
返回一个 SQLiteDatabase对象,借助这个对象可以对数据进行 CRUD 操作
修改下布局 activity_sqlite.xml 的代码如下:
修改后是这样的:
SQLiteDatabase 中提供了一个 insert() 方法用于添加数据
它接收三个参数,第一个参数是表名
第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值 NULL,一般直接传入 null 即可
第三个参数是一个 ContentValues 对象,它提供了一系列的 put() 方法重载
用于向 ContentValues 中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可
修改 activity 中的代码,如下:
public class SQLiteActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
. . .
// 添加数据
Button btn_add_data = (Button) findViewById(R.id.btn_add_data);
btn_add_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 开始组装第一条数据
values.put("name","The Da Vinci Code");
values.put("author","Dan Brown");
values.put("pages",454);
values.put("price",16.96);
db.insert("book",null,values); //插入第一条数据
values.clear();
// 开始组装第二条数据
values.put("name","The Lost Symbol");
values.put("author","Dan Brown");
values.put("pages",510);
values.put("price",19.95);
db.insert("book",null,values); //插入第二条数据
}
});
}
}
运行程序,两条数据都已经添加成功
SQLiteDatabase 中提供了一个 update() 方法
它接收四个参数,第一个参数和 insert()方法一样,是表名
第二个参数是 ContentValues 对象,要把更新数据在这里组装进去
第三、第四个参数用于去约束更新某一行或某几行中的数据
不指定的话默认就是更新所有行
修改 activity 中的代码,如下:
public class SQLiteActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
. . .
// 更新数据
Button btn_update_data = (Button) findViewById(R.id.btn_update_data);
btn_update_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 把名字为 The Da Vinci Code 的这本书的更新成666.66
values.put("price",666.66);
db.update("book",values, "name = ?", new String[]{"The Da Vinci Code"});
}
});
}
}
运行程序,点击更新数据按钮后,已经成功修改
SQLiteDatabase 中提供了一个 delete()方法用于删除数据
这个方法接收三个参数,第一 个参数仍然是表名
第二、第三个参数又是用于去约束删除某一 行或某几行的数据
不指定的话默认就是删除所有行
修改 activity 中的代码,如下:
public class SQLiteActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
. . .
// 删除数据
Button btn_delete_data = (Button) findViewById(R.id.btn_delete_data);
btn_delete_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 删除页数超过500页的书
db.delete("book", "pages > ?", new String[]{"500"});
}
});
}
}
被删除掉了
SQLiteDatabase 中提供了一个 query()方法用于查询数据
这个方法的参数非常复杂,最短的一个方法重载也需要传入七个参数
调用 query() 方法后会返回一个 Cursor 对象,查询到的所有数据都将从这个对象中取出
修改 activity 中的代码,如下:
public class SQLiteActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
. . .
// 查询数据
Button btn_query_data = (Button) findViewById(R.id.btn_query_data);
btn_query_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 查询 book 表中所有数据
Cursor cursor = db.query("book", null,null,null,null,null,null,null);
if (cursor.moveToFirst()){
do {
// 遍历 Cursor 对象,取出数据并打印
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Log.d("SQLiteActivity_query", "book name is: " + name);
Log.d("SQLiteActivity_query", "book author is: " + author);
Log.d("SQLiteActivity_query", "book pages are: " + pages);
Log.d("SQLiteActivity_query", "book price is: " + price);
}while (cursor.moveToNext());
}
cursor.close();
}
});
}
}
已经将 book 表中剩余两条数据成功地读取
db.execSQL("insert into book (name, author, pages, price) values(?, ?, ?, ?)", new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" });
db.execSQL("insert into book (name, author, pages, price) values(?, ?, ?, ?)", new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" });
db.execSQL("update Book set price = ? where name = ?", new String[] { "666.66", "The Da Vinci Code" });
db.execSQL("delete from Book where pages > ?", new String[] { "500" });
db.rawQuery("select * from Book", null);