在Android系统中内置了SQLite数据库,它是一个轻量级耳朵关系型数据库,运算速度非常快,占用资源少。
Android为了更方便地管理数据库提供了一个SQLiteOpenHelper帮助类,它是一个抽象类。
SQLite在Android中的应用请看如下实例。
1、创建数据库
(1)新建SQLiteOpenHelper实体类
package com.example.testsqllite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.widget.Toast; /** * SQLite辅助类 * @author yy * */ public class MyDBHelper extends SQLiteOpenHelper { //上下文 private Context _context; //创建表语句 private static final String CREATE_EMP_TABLE = "create table emp (" + " id integer primary key autoincrement," +" name text," +" age integer," +" address text)"; /** * 构造函数 * @param context 上下文 * @param name 数据库每次 * @param factory 查询数据时返回的cursor * @param version 数据库版本 */ public MyDBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); _context = context; } /** * 创建数据库的关键方法 */ @Override public void onCreate(SQLiteDatabase db) { //执行建表语句等 db.execSQL(CREATE_EMP_TABLE); Toast.makeText(_context, "创建数据库成功", Toast.LENGTH_SHORT).show(); } /** * 当系统当前的数据库版本和后面传入的DATABASE_VERSION不同,则执行此方法 * 比如进行数据库新表的添加,原有表字段添加、修改等操作 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //比如 db.execSQL("drop table if exists emp"); //调用onCreate方法 onCreate(db); } }
在上述类中,指定了创建表emp的sql语句等信息。
(2)activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/createDB_Button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Create DataBase" /> </LinearLayout>
该布局中只有一个按钮。
(3)MainActivity.java
package com.example.testsqllite; import com.example.testsqllite.R; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { //定义SQLite辅助类 private MyDBHelper myDBHelper; //数据库名字 private static final String DATABASE_NAME = "test.db"; //数据库版本 private static final int DATABASE_VERSION = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建数据库 myDBHelper = new MyDBHelper(this, DATABASE_NAME, null, DATABASE_VERSION); //获取创建数据库按钮对象 Button createDB_Button = (Button) findViewById(R.id.createDB_Button); //添加点击事件 createDB_Button.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { myDBHelper.getWritableDatabase(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
(4)结果
当点击按钮时,如下效果:
(5)查看数据库
当创建完数据库后,默认保存位置为/data/data/包名/databases/目录下。
使用adb shell 命令查看:
进入目录中,有两个数据库文件:一个是创建的数据库文件,另一个是为了让数据库能够支持事务而产生的临时日志文件。
使用sqlite3 test.db命令进入数据库;使用.table查看创建的表。如下
从上图中就可以看到我们创建的表emp,当然可以通过.schema命令查看建表语句。
(6)升级数据库
当我们再次点击“Create DataBase按钮时,不再弹出提示框,因为数据库已经存在,所以MyDBHelper.java中的onCreate方法不再执行。
在很多业务场景下,我们需要另外创建一个表或者修改已存在表的字段类型或长度等操作,SQLiteOpenHelper提供了另外一个方法onUpdate方法,当发现系统中的数据库版本和要创建的数据库版本不一致,则此方法要执行。
修改MainActivity中的代码
//数据库版本 private static final int DATABASE_VERSION = 2;
修改为2,重新发布程序,看到会重新执行,onUpdate方法得到执行。
下面就是SQLite在Android中的CRUD操作了。
2、添加数据
(1)修改activity_main.xml
<Button android:id="@+id/addData_Button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Add Data" />
即添加一按钮布局,用于添加数据。
(2)修改MainActivity.java
//获取addData_Button按钮对象 Button addData_Button = (Button) findViewById(R.id.addData_Button); //添加点击事件 addData_Button.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { //获取SQLiteDatabase对象 SQLiteDatabase db = myDBHelper.getWritableDatabase(); //组装数据 ContentValues cv = new ContentValues(); cv.put("name", "yy"); cv.put("age", "25"); cv.put("address", "bj"); //插入--第一个参数为表名 db.insert("emp", null, cv); //清空 cv.clear(); //组装第二条数据 cv.put("name", "hh"); cv.put("age", "24"); cv.put("address", "tj"); db.insert("emp", null, cv); } });
即在onCreate方法中添加了增加按钮的事件。
(3)效果
点击”Add Data“按钮后,两条数据添加到了数据库表emp中,使用adb shell命令进行查看。
可以看到,两条数据已经插入进去了。
3、更新数据
(1)修改activity_main.xml
<Button android:id="@+id/updateData_Button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Update Data" />
即添加了更新按钮。
(2)修改MainActivity.java
//获取更新按钮 Button updateData_Button = (Button) findViewById(R.id.updateData_Button); //添加点击事件 updateData_Button.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { //获取数据库操作对象 SQLiteDatabase db = myDBHelper.getWritableDatabase(); //组装更新的数据 ContentValues cv = new ContentValues(); cv.put("name", "yy_new"); //即更新id=1的name为yy_new //update emp set name='yy_new' where id=1 db.update("emp", cv, "id=?", new String[]{"1"}); } });
即在onCreate方法中添加了更新按钮点击事件。调用SQLiteDatabase的update方法进行更新:第一个参数为表名,第二个参数为要修改的数据,第三个参数为where条件,第四个参数为where条件对应的数据。
(3)效果
点击”Update Data“后,则对数据进行了修改。查看:
可以看出,id=1的记录name进行了修改:由yy---》yy_new。
4、删除数据
(1)修改activity_main.xml
<Button android:id="@+id/deleteData_Button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Delete Data" />
即在布局文件中添加一按钮用于删除
(2)修改MainActivity.java
//获取删除按钮 Button deleteData_Button = (Button) findViewById(R.id.deleteData_Button); //添加点击事件 deleteData_Button.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { //获取数据库操作对象 SQLiteDatabase db = myDBHelper.getWritableDatabase(); //删除主键id=1的记录 //delete from emp where id=1 db.delete("emp", "id=?", new String[]{"1"}); } });
(3)效果
点击按钮后,删除数据,查询结果如下:
即id=1的数据已经删除。
5、查询数据
(1)修改activity_main.xml文件
<Button android:id="@+id/queryData_Button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Query Data" />
添加一查询按钮
( 2)修改MainActivity文件
//获取查询按钮 Button queryData_Button = (Button) findViewById(R.id.queryData_Button); queryData_Button.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { //获取数据库操作对象 SQLiteDatabase db = myDBHelper.getWritableDatabase(); //查询 Cursor cursor = db.query("emp", null, null, null, null, null, null); while(cursor.moveToNext()){ String s = cursor.getInt(cursor.getColumnIndex("id")) +"," + cursor.getString(cursor.getColumnIndex("name")) +"," + cursor.getInt(cursor.getColumnIndex("age")) +"," + cursor.getString(cursor.getColumnIndex("address")); Log.d("s",s); } //关闭游标 cursor.close(); } });
(3)效果
点击查询按钮后,查看日志如下: