前面学习了创建和升级数据库,本篇文章主要讲解SQLite数据库存储实现增删改查(CRUD)操作。
一、添加数据
调用SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法可以创建和升级数据库,这两个方法还会返回一个SQLiteDatabase对象,借助这个对象即可对数据进行CRUD操作了。
SQLiteDatabase中提供了一个insert()方法,它有3个参数。
- 第一个是表名;
- 第二个是用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL,一般用不到此功能;
- 第三个是一个ContentValues对象,它提供了一系列的put()方法重载,用于向ContentValues中添加数据,只需将表中的每个列名以及相应的待添加数据 传入即可。
下面尝试实现添加数据。
修改activity_main.xml的代码,如下:
新增了一个按钮用于添加数据。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:///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="创建数据库"
/>
<Button
android:id="@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加数据"/>
</LinearLayout>
接着修改MainActivity的代码,如下:
下面新增了添加数据按钮的点击事件,首先获取SQLiteDatabase对象,然后使用ContentValues来对要添加的数据进行组装(这里没有给id赋值,因为在创建表时已设置自增长),最后调用insert()插入。
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
Button createDatabase = (Button) findViewById(R.id.create_database);
Button addData = findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
//下面组装第一条数据
values.put("name","四月天行健");
values.put("author","zxy");
values.put("pages","521");
values.put("price","9.9");
db.insert("Book",null,values);
values.clear();
//下面组装第二条数据
values.put("name","Android入门到实战");
values.put("author","zxy");
values.put("pages","521");
values.put("price","9.9");
db.insert("Book",null,values);
Toast.makeText(MainActivity.this, "添加成功!!!", Toast.LENGTH_SHORT).show();
}
});
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
效果如下:
二、更新数据
update()方法用于对数据更新,有4个参数。
- 第一个参数是表名;
- 第二个是ContentValues对象,把要更新的数据在这里组装进去;
- 第三四个参数用于约束更新某一行或某几行的数据,不指定则默认就是更新所有行。
下面尝试实现更新数据。
修改activity_main.xml的代码,如下:
新增了一个更新数据按钮。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:///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="更新数据"/>
</LinearLayout>
修改MainActivity中的代码,如下:
db.update("Book",values,"name = ?",new String[] {"四月天行健"});
我们把价格改为39.9,第三个参数表示更新所有name等于?的行,?是一个占位符,可通过第四个参数提供的一个字符串数组为第三个参数的每个占位符指定对应的内容。
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
Button createDatabase = (Button) findViewById(R.id.create_database);
Button addData = findViewById(R.id.add_data);
Button updateData = findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",39.9);
db.update("Book",values,"name = ?",new String[] {"四月天行健"});
Toast.makeText(MainActivity.this, "更新成功", Toast.LENGTH_SHORT).show();
}
});
......................
}
}
效果如下:
三、删除数据
delete()方法用于删除数据,有3个参数。第一个是表名;第二、三个是用于约束删除某一行或某几行的数据,不指定则默认所有行。
下面尝试实现删除数据。
修改activity_main.xml的代码,如下:
新增删除按钮。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:///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="删除数据"/>
</LinearLayout>
修改MainActivity的代码,如下:
db.delete("Book","pages > ?",new String[] {"321"});
第二三个参数指定仅删除页数超过321页的书。
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
Button createDatabase = (Button) findViewById(R.id.create_database);
Button addData = findViewById(R.id.add_data);
Button updateData = findViewById(R.id.update_data);
Button deleteButton = findViewById(R.id.delete_data);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book","pages > ?",new String[] {"321"});
}
});
.................
}
}
四、查询数据
查询数据是四个操作中最复杂的,query()方法用于查询数据,有7个参数。
- 第一个是表名;
- 第二个用于指定查询哪几列,如果不指定默认查询所有列;
- 第三四个参数用于约束查询某一行或某几行的数据,不指定则默认查询所有行;
- 第五个用于指定需要去group by的列,不指定则表示不对查询结果进行group by操作;
- 第六个参数用于对group by之后的数据进行进一步的过滤,不指定则表示不过滤;
- 第七个用于指定查询结果的排列方式,不指定则使用默认的排序方式。
详细内容参考如下:
query()方法参数 对应SQL部分 描述 table from table_name 指定查询的表名 columns select column1,column2 指定查询的列名 selection where column = value 指定where的约束条件 selectionArgs - 为where中的占位符提供具体的值 groupBy group by column 指定需要group by的列 having having column = value 对group by后的结果进一步约束 orderBy order by column1,column2 指定查询结果的排序方式
调用query()方法会返回一个Cursor对象,查询到的所有数据都将从这个对象中取出。
修改activity_main.xml代码,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:///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="查询数据"/>
</LinearLayout>
修改MainActivity代码,如下:
moveToFirst()方法是将数据的指针移动到第一行位置,然后进入循环,遍历每一行数据。
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
Button createDatabase = (Button) findViewById(R.id.create_database);
Button addData = findViewById(R.id.add_data);
Button updateData = findViewById(R.id.update_data);
Button deleteButton = findViewById(R.id.delete_data);
Button queryButton = findViewById(R.id.query_data);
queryButton.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);
if (cursor.moveToFirst()) {
do {
//遍历Cursor对象,取出数据打印
String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
String author = cursor.getString(cursor.getColumnIndexOrThrow("author"));
int pages = cursor.getInt(cursor.getColumnIndexOrThrow("pages"));
double price = cursor.getDouble(cursor.getColumnIndexOrThrow("price"));
Log.d("MainActivity", "名字:" + name);
Log.d("MainActivity", "作者:" + author);
Log.d("MainActivity", "书页:" + pages);
Log.d("MainActivity", "价格:" + price);
} while (cursor.moveToFirst());
}
cursor.close();
}
});
...........................
}
}
效果如下:
使用完整SQL语言操作数据库
前面使用的是Android提供的API来操作数据库,那么如何直接使用SQL来操作数据库呢?如下。
除了查询调用的是rawQuery()方法,其余都是execSQL()方法。
1、添加数据
db.execSQL("insert into Book (name, author, pages, price) values(?,?,?,?)",
new String[] {"Android入门到实战","zxy","521","9.9"});
2、更新数据
db.execSQL("update Book set price = ? where name = ?",new String[] {"19.9","Android入门到实战"});
3、删除数据
db.execSQL("delete from Book where pages > ?",new String[] {"321"});
4、查询数据
db.rawQuery("select * from Book",null);