在android平台上使用的是嵌入式关系型数据库SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(文本)、BLOB(二进制对象)数据类型。但实际上它也接受varchar(n)、char(n)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。SQLite最大的特点是可以把各种类型的数据保存到任何字段中,不用关心字段声明的数据类型是什么。但是有一种情况例外:定义INTEGER类型的字段为PRIMARY KEY时,该字段就只能存储64位整数,保存除整数以外的数据就会产生错误。
我们直接看代码实现,首先是StudentDBHelper.java,它继承了数据库创建与打开的帮助类SQLiteOpenHelper。我们用它来创建出数据库student.db。
StudentDBHelper.java
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class StudentDBHelper extends SQLiteOpenHelper { /** * 必须要写的构造方法 * * @param context */ public StudentDBHelper(Context context) { // 四个参数分别表示 // context:上下文 // student.db:database的名称 // null:是一个CursorFactory,cursor表示游标,用来移动查询结果集 // 1:数据库版本 super(context, "student.db", null, 1); } /** * 在数据库第一次被创建时调用 */ @Override public void onCreate(SQLiteDatabase db) { // 数据库创建student表语句 db.execSQL("create table student (id integer primary key autoincrement, name varchar(16), major varchar(32))"); } /** * 当数据库版本有改变时才会调用该方法 * * @param oldVersion * 旧版本 * * @param newVersion * 新版本 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("版本改为:" + newVersion); // 当数据库版本发生变化是时里面的代码才会执行 } }
接下来是对数据库的增删改查操作类:
StudentDao.java
import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class StudentDao { private StudentDBHelper stuHelper; public StudentDao(Context context) { // 实例化一个StudentDBHelper对象 stuHelper = new StudentDBHelper(context); } /** * 查找某位学生是否存在 */ public boolean find(String name) { // TODO Auto-generated method stub SQLiteDatabase db = stuHelper.getWritableDatabase(); // 普通的SQL执行语句 // Cursor cursor = db.rawQuery("SELECT * FROM student WHERE name = ?", // new String[] { name }); // 下面的是android提供的专门的查询方法 /* * 各个参数分别表示, 参数1:student表名; 参数2:需要返回信息的列名集合,是一个String[]数组,null表示返回所有列; * 参数3:过滤条件,表示哪一行需要被返回,相当于SQL语句查询WHERE后跟的属性名称; * 参数4:与参数3对应,表示属性值,是一个String[]数组;参数5:groupBy;参数6:having;参数7:orderBy; */ Cursor cursor = db.query("student", null, "name=?", new String[] { name }, null, null, "id"); boolean result = cursor.moveToNext(); cursor.close(); db.close(); return result; } /** * 查找全部学生信息,并将信息添加到集合里 */ public List<StudentInfo> findAll() { // TODO Auto-generated method stub List<StudentInfo> stuList = new ArrayList<StudentInfo>(); SQLiteDatabase db = stuHelper.getWritableDatabase(); // 普通的SQL执行语句 // Cursor cursor = db.rawQuery("SELECT * FROM student", null); // android提供的专门的查询方法,参数详解见find方法 Cursor cursor = db.query("student", null, null, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); String major = cursor.getString(cursor.getColumnIndex("major")); StudentInfo stuInfo = new StudentInfo(); stuInfo.setId(id); stuInfo.setName(name); stuInfo.setMajor(major); stuList.add(stuInfo); } cursor.close(); db.close(); return stuList; } /** * 插入一条学生信息 */ public void insert(String name, String major) { // TODO Auto-generated method stub SQLiteDatabase db = stuHelper.getWritableDatabase(); // 普通的SQL执行语句 // db.execSQL("INSERT INTO student (name, major) VALUES (?,?)", // new String[] { name, major }); // android提供的专门的插入方法 ContentValues values = new ContentValues(); values.put("name", name); values.put("major", major); /* * 各个参数分别表示, 参数1:student表名; 参数2:需要返回信息的列名集合,是一个String[]数组; * 参数3:一个ContentValues对象,用法相当于Map集合,将字段名称当key值,内容当value即可; * 该方法返回值为int类型,rowId表示新插入的数据的行id; */ long rowId = db.insert("student", null, values); db.close(); } /** * 修改学生专业 */ public void update(String name, String major) { // TODO Auto-generated method stub SQLiteDatabase db = stuHelper.getWritableDatabase(); // 普通的SQL执行语句 // db.execSQL("UPDATE student set major=? WHERE name=?", new String[] { // major, name }); // android提供的专门的更改方法 ContentValues values = new ContentValues(); values.put("major", major); /* * 各个参数分别表示, 参数1:student表名; * 参数2:一个ContentValues对象,用法相当于Map集合,将字段名称当key值,内容当value即可; * 参数3:过滤条件,表示哪一行需要被修改,相当于SQL语句WHERE后跟的属性名称; * 参数4:与参数3对应,表示属性值,是一个String[]数组; 该方法返回值为int类型,rowId表示被修改数据的行id; */ int rowId = db.update("student", values, "name=?", new String[] { name }); db.close(); } /** * 删除数据 */ public void delete(String name) { // TODO Auto-generated method stub SQLiteDatabase db = stuHelper.getWritableDatabase(); // 普通的SQL执行语句 // db.execSQL("DELETE FROM student WHERE name=?", new String[] { name // }); // android提供的专门的删除方法 /* * 各个参数分别表示, 参数1:student表名; 参数2:过滤条件,表示哪一行需要被删除,相当于SQL语句WHERE后跟的属性名称; * 参数3:与参数2对应,表示属性值,是一个String[]数组; 该方法返回值为int类型,rowId表示受影响的行id; */ int rowId = db.delete("student", "name=?", new String[] { name }); db.close(); } }
之后,只需要实例化一个StudentDao 对象就可以对数据库student.db中的student表进行增删改查的操作了。
需要提醒的是:大家可以看到StudentDao .java中每个方法我都有注释掉几行“普通的SQL执行语句”的代码,其实被注释掉的这几句代码的执行结果和我用的代码的执行结果是一样的,选用哪个都可以。