SQLite数据库是一款轻量级关系型数据库,运行速度很快,占用资源少,适用于移动设备,同时支持标准的SQL语法,支持数据库ACID事务。
SQLite数据库支持integer(整型)、real(浮点型)、text(文本型)与blob(二进制)等数据类型。
一、创建数据库
SQLite使用SQLiteOpenHelper类实现对数据库的创建与升级。SQLiteOpenHelper类是一个抽象类,当继承该类时需要重写onCreate()方法与onUpgrade()方法,同时在这两个方法内实现创建更新数据库的功能。
SQLiteOpenHelper类内有两个实例方法都可实现创建和打开一个现有的数据库,并返回一个可对数据库读写操作的对象:
getReadableDatabase():当数据库不可写时,以只读的形式打开数据库。
getWritableDatabase():当数据库不可写时,出现异常。
SQLiteOpenHelper类的构造方法:
第一个参数:Context。
第二个参数:数据库名。
第三个参数:允许查询数据时返回一个自定义的Cursor,一般传入null。
第四个参数:当前数据库的版本号,用于对数据库的升级操作。
构建过程:
1、构建出SQLiteOpenHelper实例。
2、调用getReadableDatabase()方法或getWritableDatabase()方法创建数据库。
此时数据库就会存放在/data/data/<package name>/databases/目录下。此时重写的onCreate()方法会得到执行,所以通常会在这里去处理一些创建表的逻辑。
1、新建MyDatabaseHelper类继承自SQLiteOpenHelper
public class MyDatabaseHelper extends SQLiteOpenHelper {
//建表语句定义为一串字符串
public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
private Context mContext;
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
// execSQL()方法用于执行SQL语句
sqLiteDatabase.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
2、修改activity_main.xml中的代码,加入一个Button用于创建数据库。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create Batabase"/>
</LinearLayout>
3、修改MainActivity。
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//构建SQLiteOpenHelper实例,指定版本号为1
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//创建数据库
myDatabaseHelper.getWritableDatabase();
}
});
}
}
当第一次点击createDatabase按钮时,当前程序会检测系统中是否存在BookStore.db文件,若不存在创建数据库并调用MyDatabaseHelper中的onCreate()方法,创建Book表,弹出Toast提示创建成功。当创建成功时,系统中已存在BookStore.db文件,再次点击按钮不会再创建一次。
二、升级数据库
onUpdate()方法用于对数据库进行升级。
1、添加Category表到MyDatabaseHelper中,加入新的建表语句并执行。
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
public static final String CREATE_CATEGORY = "create table Category ("
+ "id integer primary key autoincrement, "
+ "category_name text, "
+ "category_code integer)";
private Context mContext;
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
sqLiteDatabase.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
2、运用SQLiteOpenHelper的升级功能。
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop table if exists Book");
sqLiteDatabase.execSQL("drop table if exists Category");
onCreate(sqLiteDatabase);
}
3、在MainActivity中修改MyDatabaseHelper中构造函数的版本号,让onUpgrade()方法得以执行。
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//将MyDatabaseHelper中构造方法的版本号从1改为2
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myDatabaseHelper.getWritableDatabase();
}
});
}
}
三、添加数据
当调用SQLiteOpenHelper的getReadableDatabase()方法或getWritableDatabase()方法不仅可以用于创建和升级数据库,同时该方法会返回一个SQLiteDatabase对象,借助这个对象就可以对数据进行CRUD操作了。
SQLiteDatabase提供了insert()方法专门用于添加数据。
第一个参数:数据库表名
第二个参数:在未指定添加数据的情况下给某个可为空的列自动赋值null,一般传入null
第三个参数:ContentValues对象,它提供了一系列put()方法重载,用于向ContentValues中添加数据,只需将将表中列名与待添加数据传入即可。
1、修改activity_mian中代码,添加Button按钮用于添加数据。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
……
<Button
android:id="@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add Data"/>
</LinearLayout>
2、修改MainActivity中代码。
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
……
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//获取SQLiteDatabase对象
SQLiteDatabase sqLiteDatabase = myDatabaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
//组装数据
contentValues.put("name","The Da Vinci Code");
contentValues.put("author","Dan Brown");
contentValues.put("pages",454);
contentValues.put("price",16.96);
//添加数据
sqLiteDatabase.insert("Book",null,contentValues);
//添加下一组数据前需要清空ContentValues
contentValues.clear();
contentValues.put("name","The Lost Symbol");
contentValues.put("author","Dan Brown");
contentValues.put("pages",510);
contentValues.put("price",19.95);
sqLiteDatabase.insert("Book",null,contentValues);
}
});
}
}
四、更新数据
SQLiteDatabase提供了update()方法专门用于更新数据。
第一个参数:表名
第二个参数:ContentValues对象,只需更新的数据组装进去。
第三、四个参数:用于约束更新某一行或某几行的数据,不指定则默认更新所有。
1、修改activity_main.xml,添加按钮更新数据。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
……
<Button
android:id="@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Update Data"/>
</LinearLayout>
2、修改MainActivity中代码。
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
……
Button updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase sqLiteDatabase = myDatabaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
//修改price价格
contentValues.put("price",10.99);
//更新代码,其中第三个参数为SQL语句中where的部分,第四个参数为第三个参数占位符所指代的内容。
sqLiteDatabase.update("Book",contentValues,"name = ?",new String[]{"The Da Vinci Code"});
}
});
}
}
五、删除数据
SQLiteDatabase提供了delete()方法专门用于删除数据。
第一个参数:表名
第二、三个参数:用于约束更新某一行或某几行的数据,不指定则默认删除所有。
1、修改activity_main.xml,添加按钮删除数据。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
……
<Button
android:id="@+id/delete_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Delete Data"/>
</LinearLayout>
2、修改MainActivity中代码。
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
……
Button deleteData = (Button) findViewById(R.id.delete_data);
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase sqLiteDatabase = myDatabaseHelper.getWritableDatabase();
//指定删除页数超过500的书
sqLiteDatabase.delete("Book","pages > ?",new String[]{"500"});
}
});
}
}
六、查询数据
SQLiteDatabase提供了query()方法专门用于查询数据。
第一个参数:查询的表名。
第二个参数:指定查询哪几列,不指定则查询所有。
第三个参数:指定where的约束条件。
第四个参数:为where的占位符提供具体的值。
第五个参数:指定需要的group by的列。
第六个参数:对group by后的结果进行进一步过滤。
第七个参数:指定查询结果的排序方式。
1、修改activity_main.xml,添加按钮删除数据。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
……
<Button
android:id="@+id/query_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Query Data"/>
</LinearLayout>
2、修改MainActivity中代码。
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
…….
Button queryData = (Button) findViewById(R.id.query_data);
queryData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase sqLiteDatabase = myDatabaseHelper.getWritableDatabase();
//查询语句。
Cursor cursor = sqLiteDatabase.query("Book",null,null,null,null,null,null);
//将数据的指针移动到第一行位置。
if(cursor.moveToFirst()){
do{
// getColumnIndex()方法获取某一列在表中对应位置索引
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("MainActivity", "book name is " + name);
Log.d("MainActivity", "book author is " + author);
Log.d("MainActivity", "book pages is " + pages);
Log.d("MainActivity", "book price is " + price);
}while(cursor.moveToNext());
//使用结束时调用close()方式关闭Cursor
cursor.close();
}
}
});
}
}
七、使用SQL操作数据库。
Android同样支持直接使用SQL来操作数据库。可运用rawQuery()方法查询数据和execSQL()方法进行其他操作。