SQLite数据库是Android系统的内置数据库,是一款轻量级的Android数据库,它的运算速度非常快。一般在存储大量的复杂的关系型数据的时候进行使用。
Android 提供了SQLiteOpenHelper帮助类对SQLite数据库进行简单的创建跟升级,并且SQLiteOpenHelper类是一个抽象类,需要自己创建一个类继承这个类,其中有两个抽象方法 onCreate()以及onUpgrade(),必须在我们自己的帮助类中重写这两个方法。SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()和getWritableDatabase(),这两个方法都可以创建或者打开一个现有的数据库,数据库已存在就直接打开,数据库不存在就创建,并返回一个可对数据库进行读写操作的对象。当数据库不可写入的时候,只能使用getReadableDatabase()方法打开数据库,否则就会出现异常。
创建一个数据库的SQLite语句如下(一个名为BookStore的数据库,以及一个名为Book的表):
create table Book(
id integer primary key autoincrement,
author text,
price real,
pages integer)
注:integer表示整型,real表示浮点型,text表示文本类型,blob表示二进制类型。primary key将id设置为主键,autoincreament则表示id是自增长的,入库时会自动生成,不需要手动赋值。同时需要在代码中执行这个SQL语句,完成创建表的操作。
1.这里创建一个MyDatabaseHelper继承自SQLiteOpenHelper
public class MyDatabaseHelper extends SQLiteOpenHelper { private Context mcontext; private static final String CREATE_BOOK="create table Book("+ "author text,"+ "pages integer,"+ "price real,"+ "name real)";//创建一个Book表 private static final String CREATE_CATEGORY="create table Category("+ "id integer primary key autoincrement,"+ "category_name text,"+"category_code integer)";//创建另一个category表 public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); //重写四个参数的构造函数,第一个参数是context,用于对数据库进行操作。 // 第二个参数是数据库的名字,我们预先定义的是BookStore。 // 第三个参数是查询数据的时候返回一个自定义的Cursor,一般都是传入null值。 // 第四个参数是当前数据库的版本号,用于对数据库进行升级。 // TODO Auto-generated constructor stub mcontext=context; } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL(CREATE_BOOK);//执行建表语句。 } @Override public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) { // TODO Auto-generated method stub } } }
在执行完getReadableDatabase()(或者getWritableDatabase())方法之后,此时并没有BookStore.db这个数据库,因此会创建这个数据库并且调用MyDatabaseHelper的onCreate()方法,onCreate()方法只有在第一次创建数据库时才会调用。如果此时我希望在数据库中再次加入category这个表,那么只能在onUpgrade()方法中进行修改,加入
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) { // TODO Auto-generated method stub db.execSQL(CREATE_CATEGORY);同时修改版本号,版本号改变,重新运行才能调用 onUpgrade()方法,如下。
dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,2);这样重新运行,category表就能插入到数据库当中了。 2.设置四个按钮,对数据进行操作,即CRUD,C添加(Create),R查询(Retrieve),U更新(Update),D删除(Delete)。分别对应相应的SQL语句为,添加insert,查询select,更新update,删除使用delete。
xml文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.example.test.test.MainActivity" tools:showIn="@layout/activity_main"> <Button android:id="@+id/add_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Add to book"/> <Button android:id="@+id/update_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Update book" /> <Button android:id="@+id/delete_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Delete from book" /> <Button android:id="@+id/query_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Query from book" /> </RelativeLayout>3.在MainActivity中进行点击事件的添加跟处理。
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 addDatabase=(Button)findViewById(R.id.add_data); Button updateDatabase=(Button)findViewById(R.id.update_data); Button deleteDatabase=(Button)findViewById(R.id.delete_data); Button queryDatabase=(Button)findViewById(R.id.query_data); addDatabase.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub SQLiteDatabase db=dbHelper.getWritableDatabase(); ContentValues values=new ContentValues();//对要添加的数据进行组装 values.put("name","The King"); values.put("author", "Mating"); values.put("pages", "10224"); values.put("price", "89.9"); db.insert("Book",null,values);//三个参数,第一个参数为表名。第二个参数为未指定数据的情况下, // 对可为空的列自动赋值为null。第三个参数为ContentValues对象。 // values.clear();//如果需要插入多条数据,则需要调用clear()清空上一条数据。 } }); updateDatabase.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub SQLiteDatabase db=dbHelper.getWritableDatabase(); ContentValues values=new ContentValues(); values.put("price",100.99); //四个参数。第一个参数是表名, // 第二个参数是ContentValues对象,第三个参数为更新哪一行,即where name=aaaa中的name,第四 个参数为所要修改的内容 db .update("Book",values,"name=?",new String[]{"The King"}); } }); deleteDatabase.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub SQLiteDatabase db=dbHelper.getWritableDatabase(); db.delete("Book", "pages>?", new String[]{"500"});//参数同上,不需要ContentValues对象 } }); queryDatabase.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub SQLiteDatabase db=dbHelper.getWritableDatabase(); Cursor cursor=db.query("Book", new String[]{"name","pages"},"price=?and author=? ",new String[]{"89.9","Mating"},null,null,null); if(cursor.moveToFirst()){//将指针移动到第一行,判断当前的Cursor对象是否有数据。 do{ String name=cursor.getString(cursor.getColumnIndex("name")); int pages=cursor.getInt(cursor.getColumnIndex("pages")); Log.d("name is", name); Log.d("pages is", pages+""); }while(cursor.moveToNext()); cursor.close(); } } }); }}4.如果我们希望能够将删除数据跟添加数据绑定在一起,还可以使用一个事务。即
SQLiteDatabase db=dbHelper.getWritableDatabase(); db.beginTransaction(); db.delete("Book",null,null); ContentValues values=new ContentValues(); values.put("name","The Tom"); values.put("author", "Tom"); values.put("pages", "10278"); values.put("price", "67.9"); db.insert("Book",null,values); db.setTransactionSuccessful(); db.endTransaction();这样删除和添加会同时执行,若添加不成功,则旧数据也不会成功删除。