Android 为了让我们更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper 帮助类,借助这个类可以简单地对数据库继续宁创建和升级。
SQLiteOpenHelper 的基本用法:
SQL... 是一个抽象类,使用的话,需要创建一个自己的帮助类去继承它,有两个抽象方法:onCreate() 和 onUpgrade() ,需要在自己的帮助类中重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。
SQL... 两个实例方法:getReadableDatabase() 和 getWritableDatabase() 。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建新的),并返回一个可对数据库进行读写操作的对象。
SQL...的构造方法:4个参数,1-Context,2-数据库名,3-Cursor(null),4-当前数据库版本号,可用于对数据库进行升级操作。
构建出 SQLiteOpenHelper 的实例之后,再调用它的 getReadableDatabase() 或 getWritableDatabase() 方法就可以创建数据库了。
1. 新建 MyDatabaseHelper 类 继承自 SQLiteOpenHelper,在代码中执行SQL语句创建表
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 db) { db.execSQL(CREATE_BOOK); Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }2. activity_main.xml 加入一个按钮,点击用于创建数据库
<?xml version="1.0" encoding="utf-8"?> <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 database" /> </LinearLayout>3. MainActivity.java
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, 1); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } }); } }在 onCreate() 方法中构建了一个 MyDatabaseHelper 对象,并且通过构造函数的参数将数据库名指定为 BookStore.db, 版本号指定为 1,然后在 Create database 按钮的点击事件里调用了 getWritableDatabase() 方法,创建数据库并调用 MyDatabaseHelper 中的 onCreate() 方法。
打开 AS右下角的 Device File Explorer 找到 BookStore.db
右键另存为到桌面上,使用 SQLiteStudio 软件打开,如下
onUpgrade() 方法,对数据库进行升级
目前 DatabaseTest 项目中已经有一张 Book 表用于存放书的各种详细数据,再添加一张 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 db) { db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exists Book"); db.execSQL("drop table if exists Category"); onCreate(db); } }在 onUpgrade() 方法中执行了两条 DROP 语句,如果发现数据库中已经存在 Book表 或 Category 表,就把这两张表删除掉,再调用 onCreate() 方法重新创建。
修改 MainActivity 中的代码,版本号传入比 1 大的数
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); createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } }); } }重新运行,查看数据库如下:
SQLiteDatabase 提供了一个 insert() 方法,用于添加数据,接收 3 个参数:1-表名,2-null,3-ContentValues对象,提供了一系列的 put() 方法重载,用于向 ContentValues 中添加数据,只需要将表中每个列名以及相应的待添加数据传入即可。
修改 activity_main.xml 添加一个按钮:
<Button android:id="@+id/add_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Add data" />修改 MainActivity.java :
Button addData = (Button)findViewById(R.id.add_data); addData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { 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("Boook", 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 来对要添加的数据进行组装。然后调用 insert() 方法将数据添加到表中。
update() 方法,4个参数:1-表名,2-ContentValues对象,3、4-约束更新某一行或某几行中的数据,不指定的话默认更新所有
修改 activity_main.xml 提加按钮
<Button android:id="@+id/update_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="update data" />修改 MainActivity.java,添加点击事件
Button updateData = (Button) findViewById(R.id.update_data); updateData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.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 = ?的行,而 ?是一个占位符,可以通过第四个参数提供的一个字符串数组为第三个参数中的每个占位符指定相应的内容。
delete()方法,接收3个参数:1-表名,2、3-约束删除某一行或某几行的数据,不指定默认就是删除所有行。
修改 activity_main.xml
<Button android:id="@+id/delete_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Delete data" />修改 MainActivity.java,添加按钮点击事件
Button deleteButton = (Button) findViewById(R.id.delete_data); deleteButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); db.delete("Book", "pages > ?", new String[] { "500" }); } });指明删除 Book 表中的数据,指定仅删除 页数超过 500页 的书