文章目的:快速入门Android的SQLite增删改查功能!
前言:通过之前文章的学习,你已经掌握了快速创建和升级数据库的方法,接下来就该学习一下如何对表中的数据进行操作了。我们可以对数据进行的操作有四种,即 CRUD。其中 C 代表添加(Create),R 代表查询(Retrieve) ,U代表更新(Update) ,D代表删除(Delete) 。每一种操作又各自对应了一种 SQL命令,添加数据时使用 insert,查询数据时使用 select,更新数据时使用 update,删除数据时使用 delete。
开发环境:
- 编写代码工具:Android Studio 2.2.2
- compileSdkVersion 25
- buildToolsVersion “25.0.0”
- minSdkVersion 19
- targetSdkVersion 25
- compile ‘com.android.support:appcompat-v7:25.0.0’
提示:文章末尾下载项目时注意开发环境的更改,以免造成不必要的时间浪费。
一、添加数据
SQLiteDatabase 中提供了一个 insert()方法,这个方法就是专门用于添加数据的。它接收三个参数,第一个参数是表名,我们希望向哪张表里添加数据,这里就传入该表的名字。第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值 NULL, 一般我们用不到这个功能, 直接传入 null 即可。 第三个参数是一个 ContentValues 对象, 它提供了一系列的 put()方法重载,用于向 ContentValues 中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可。
首先,我们在布局文件中,创建一个Button来执行添加数据
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加数据"
android:id="@+id/add_data"/>
我们修改 MainActivity中的代码
public class MainActivity extends AppCompatActivity {
private Button mButton;
private MySqlDataHelper helper;
private Button add_data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = ((Button) findViewById(R.id.creat));
/*这个构造方法中接收四个参数,第一个参数是 Context,第二个参数是给数据库创建一个名字,
第三个参数允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null。
第四个参数表示当前数据库的版本号,传入1即可,更新的话,数字改成大于1的即可*/
helper = new MySqlDataHelper(this, "BookStore.db", null, 2);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//执行写入数据
helper.getWritableDatabase();
}
});
/**
* 添加数据
*/
add_data = ((Button) findViewById(R.id.add_data));
add_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = helper.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 对象,然后使用ContentValues来对要添加的数据进行组装。如果你比较细心的话应该会发现, 这里只对 Book表里其中四列的数据进行了组装,id那一列没并没给它赋值。这是因为在前面创建表的时候我们就将 id 列设置为自增长了,它的值会在入库的时候自动生成,所以不需要手动给它赋值了。接下来调用了 insert()方法将数据添加到表当中, 注意这里我们实际上添加了两条数据,上述代码中使用 ContentValues 分别组装了两次不同的内容,并调用了两次 insert()方法。
接下来我们运行程序,点击button。
数据就创建好了,这里就不去查看db文件的内容了。
二、更新数据
SQLiteDatabase 中也是提供了一个非常好用的 update()方法用于对数据进行更新,这个方法接收四个参数,第一个参数和insert()方法一样,也是表名,在这里指定去更新哪张表里的数据。第二个参数是 ContentValues 对象,要把更新数据在这里组装进去。第三、第四个参数用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。
比如现在我们要修改我们创建好的数据库(书)的一个价格,要怎么操作呢?
首先修改 activity_main.xml 中的代码
<Button
android:id="@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新数据"
/>
我们接着修改MainActivity中的代码
public class MainActivity extends AppCompatActivity {
private Button mButton;
private MySqlDataHelper helper;
private Button add_data;
private Button updata_data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = ((Button) findViewById(R.id.creat));
/*这个构造方法中接收四个参数,第一个参数是 Context,第二个参数是给数据库创建一个名字,
第三个参数允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null。
第四个参数表示当前数据库的版本号,传入1即可,更新的话,数字改成大于1的即可*/
helper = new MySqlDataHelper(this, "BookStore.db", null, 2);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//执行写入数据
helper.getWritableDatabase();
}
});
/**
* 添加数据
*/
add_data = ((Button) findViewById(R.id.add_data));
add_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = helper.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); // 插入第二条数据
}
});
/**
* 更新数据
*/
updata_data = ((Button) findViewById(R.id.update_data));
updata_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name = ?", new String[] { "The Da Vinci Code" });
}
});
}
}
这里在更新数据按钮的点击事件里面构建了一个 ContentValues 对象,并且只给它指定
了一组数据,说明我们只是想把价格这一列的数据更新成 10.99。 然后调用SQLiteDatabase
的 update()方法去执行具体的更新操作,可以看到,这里使用了第三、第四个参数来指定具
体更新哪几行。第三个参数对应的是 SQL 语句的 where 部分,表示去更新所有 name 等于?的行,而?是一个占位符,可以通过第四个参数提供的一个字符串数组为第三个参数中的每个占位符指定相应的内容。因此上述代码想表达的意图就是,将名字是 The Da Vinci Code的这本书的价格改成 10.99。
我们运行程序后,价格数据就会被改变了。
三、删除数据
SQLiteDatabase 中提供了一个delete()方法专门用于删除数据,这个方法接收三个参数,第一个参数仍然是表名,这个已经没什么好说的了,第二、第三个参数又是用于去约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。
还是老样子,修改 activity_main.xml中的代码<Button
android:id="@+id/delete_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除数据"
/>
接着修改MainActivity的代码
public class MainActivity extends AppCompatActivity {
private Button mButton;
private MySqlDataHelper helper;
private Button add_data;
private Button updata_data;
private Button delete_data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = ((Button) findViewById(R.id.creat));
/*这个构造方法中接收四个参数,第一个参数是 Context,第二个参数是给数据库创建一个名字,
第三个参数允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null。
第四个参数表示当前数据库的版本号,传入1即可,更新的话,数字改成大于1的即可*/
helper = new MySqlDataHelper(this, "BookStore.db", null, 2);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//执行写入数据
helper.getWritableDatabase();
}
});
/**
* 添加数据
*/
add_data = ((Button) findViewById(R.id.add_data));
add_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = helper.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); // 插入第二条数据
}
});
/**
* 更新数据
*/
updata_data = ((Button) findViewById(R.id.update_data));
updata_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name = ?", new String[] { "The Da Vinci Code" });
}
});
/**
* 删除数据
*/
delete_data = ((Button) findViewById(R.id.delete_data));
delete_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = helper.getWritableDatabase();
db.delete("Book", "pages > ?", new String[] { "500" });
}
});
}
}
可以看到,我们在删除按钮的点击事件里指明去删除 Book表中的数据, 并且通过第二、第三个参数来指定仅删除那些页数超过 500页的书籍。当然这个需求很奇怪,这里也仅仅是为了做个测试。你可以先查看一下当前Book 表里的数据,其中 The Lost Symbol 这本书的页数超过了 500页,也就是说当我们点击删除按钮时,这条记录应该会被删除掉。
运行程序,执行删除数据,我们就达到了数据的删除。
四、查询数据
SQLiteDatabase 中提供了一个query()方法用于对数据进行查询,这个方法的参数非常复杂,最短的一个方法重载也需要传入七个参数。那我们就先来看一下这七个参数各自的含义吧,第一个参数不用说,当然还是表名,表示我们希望从哪张表中查询数据。第二个参数用于指定去查询哪几列,如果不指定则默认查询所有列。第三、第四个参数用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据。第五个参数用于指定需要去 group by的列,不指定则表示不对查询结果进行 group by操作。第六个参数用于对 group by之后的数据进行进一步的过滤,不指定则表示不进行过滤。第七个参数用于指定查询结果的排序方式,不指定则表示使用默认的排序方式。更多详细的内容可以参考下表。其他几个 query()方法的重载其实也大同小异,你可以自己去研究一下,这里就不再进行介绍了。
query() 方法参数 应 对应 SQL 部分 描述
table fromtable_name 指定查询的表名
columns select column1,column2 指定查询的列名
selection where column =value 指定 where 的约束条件
selectionArgs - 为 where中的占位符提供具体的值
groupBy group bycolumn 指定需要 group by的列
having having column =value 对 group by后的结果进一步约束
orderBy order by column1,column2 指定查询结果的排序方式
修改activity_main中的代码
<Button
android:id="@+id/query_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询数据" />
修改MainActivity中的代码
/**
* 查询数据
*/
query_data = ((Button) findViewById(R.id.query_data));
query_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = helper.getWritableDatabase();
// 查询Book 表中所有的数据
Cursor cursor = db.query("Book", 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("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());
}
cursor.close();
}
});
接下来我们执行程序,点击查询数据,就可以达到我们要查询的效果。
打印出的Logd的数据:
五、总结
Android中的数据库是一大难点,但是如果仔细学习,记住创建,升级,增删改查这几个点,那么其实使用起来也比较容易。
项目下载地址:http://pan.baidu.com/s/1nvLdMU9欢迎大家加微信进行技术交流和提出意见, 欢迎大家关注我的微信公众号,我一定会最快回复你!