android开发之SQLite详解

来源:互联网 发布:java预览excel 编辑:程序博客网 时间:2024/06/16 02:20

为了方便使用SQLite数据库,Android SDK提供了一系列都数据库进行操作的类和接口,接下来针对个别类和接口进行简单介绍:

 

SQLiteOPenHelper:是一个抽象类,该类用于创建数据库数据库版本的更新

SQLiteDatabase:是一个数据库访问类,可对数据库进行增删改查

Cursor:是一个游标接口,在数据库操作中作为返回值,相当于结果集ResultSet

 

在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情:

  • Cursor 是每行的集合。
  • 使用 moveToFirst() 定位第一行。
  • 你必须知道每一列的名称。
  • 你必须知道每一列的数据类型。
  • Cursor 是一个随机的数据源。
  • 所有的数据都是通过下标取得。

关于 Cursor 的重要方法

  • close()
    关闭游标,释放资源
  • getColumnNames()
    返回一个字符串数组的列名
  • getCount()
    返回Cursor 中的行数
  • moveToFirst()
    移动光标到第一行
  • moveToNext()
    移动光标到下一行
  • getColumnIndex(String columnName)
    返回指定列的名称,如果不存在返回-1

Android系统推荐使用SQLiteOpenHelper的子类创建SQLite创建数据库,因此需要创建一个子类继承自SQLiteOpenHelper,重写onCreate()与onUpgrade()方法,并在onCreate()方法中执行创建数据库的命令。具体代码如下所示:

DBOpenHelper.java

package com.abc.DBsqlite;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;//在实际使用的时候,通常都要封装一个继承SQLiteOpenHelper类的数据库操作类。//SQLiteOpenHelper类是一个抽象的辅助类,主要用来生成一个数据库public class DBOpenHelper extends SQLiteOpenHelper {/* * public DBOpenHelper(Context context, String name, CursorFactory factory, * int version) { super(context, name, factory, version); // TODO * Auto-generated constructor stub } */<span style="color:#ff0000;">// 要注意的是,在构造函数时并没有真正创建数据库,而是在调用getWriteableDatabase()或者getReadableDatabase()方法的时候系统才会真正创建数据库,</span>private static final String DATABASE = "student.db";// 数据库名称// 创建数据库private static final int VENSION = 1;    <span style="color:#ff0000;">//数据库的构造方法,用来定义数据库的名称,数据库的查询结果集,数据库的版本</span>public DBOpenHelper(Context context) {super(context, DATABASE, null, VENSION);// TODO Auto-generated constructor stub}// 这两个方法是必须重写的onCreate、onUpgrade@Overridepublic void onCreate(SQLiteDatabase arg0) {// 在SQLiteOpenHelper中首先执行的是onCreate方法(当数据库第一次创建时),一般在这个方法里生成数据表// 创建表String sql = "create table tb_student(Id varchar(10) primary key,Name varchar(10),Speciality varchar(20),Qq varchar(10))";arg0.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {// TODO Auto-generated method stub// 当数据库需要升级时,系统会自动调用这个方法,一般我们在这个方法里删除数据表,并建立新的数据表,并根据实际需求做其他的操作}}

前面介绍了如何创建数据库,接下来以Student表为例

Student.java

package com.abc.entity;//基础类public class Student {    private String Id;    private String Name;    private String Speciality;    private String Qq;public String getId() {return Id;}public void setId(String id) {Id = id;}public String getName() {return Name;}public void setName(String name) {Name = name;}public String getSpeciality() {return Speciality;}public void setSpeciality(String speciality) {Speciality = speciality;}public String getQq() {return Qq;}public void setQq(String qq) {Qq = qq;}public Student() {super();}public Student(String id, String name, String speciality, String qq) {super();Id = id;Name = name;Speciality = speciality;Qq = qq;}@Overridepublic String toString() {return "Student [Id=" + Id + ", Name=" + Name + ", Speciality="+ Speciality + ", Qq=" + Qq + "]";}}


接下来介绍如何向表中进行增删该查操作,首先要得到一个可读写的SQLiteDatabase对象,具体代码如下所示:

StudentDAO.java

package com.abc.dao;import java.util.ArrayList;import java.util.List;import com.abc.DBsqlite.DBOpenHelper;import com.abc.entity.Student;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class StudentDAO {private DBOpenHelper helper;// SQLiteOpenHelper实例对象private SQLiteDatabase db;// 数据库实例对象public StudentDAO(Context context) {helper = new DBOpenHelper(context);}<span style="color:#009900;">/** * 插入一条数据(相当于增加数据) *  * @param student */</span>public void add(Student student) {db = helper.getWritableDatabase();// 连接数据库db.execSQL("insert into tb_student values(?,?,?,?)", new String[] {student.getId(), student.getName(), student.getSpeciality(),student.getQq() });db.close();}<span style="color:#009900;">/** * 增加数据 *  * @param student */</span>public void addContentValues(Student student) {db = helper.getWritableDatabase();ContentValues cv = new ContentValues();// ContentValues 和HashTable类似都是一种存储的机制// 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,// 像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象。cv.put("Id", student.getId());cv.put("Name", student.getName());cv.put("Speciality", student.getSpeciality());cv.put("Qq", student.getQq());db.insert("tb_student", null, cv);db.close();}<span style="color:#009900;">/** * 1、查询所有student数据——————使用rawQuery方法 *  * @return */</span>public List<Student> quereyTable() {List<Student> listStudents = new ArrayList<Student>();db = helper.getReadableDatabase();// 显示视图Cursor cursor = db.rawQuery("select * from tb_student", null);// 挨个遍历while (cursor.moveToNext()) {Student student = new Student();student.setId(cursor.getString(0));student.setName(cursor.getString(1));student.setSpeciality(cursor.getString(2));student.setQq(cursor.getString(3));// 添加到集合listStudents.add(student);db.close();}return listStudents;}<span style="color:#009900;">/** * 1、查询单个student数据——————使用rawQuery方法 *  * @param student * @return */</span>public Student quereyStudentRaw(Student student) {// Student student1 = new Student();db = helper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from tb_student where Id=?",new String[] { student.getId() });// 用数组填充占位符// 要创建一个Cursor(游标),必须执行一个查询,通过SQL使用rawQuery()方法或是更精心的query()方法,而不能使用execSQL(String// sql)方法。while (cursor.moveToNext()) {student.setId(cursor.getString(cursor.getColumnIndex("id")));// 返回指定列的名称,如果不存在返回-1// student.setId(cursor.getString(0));student.setName(cursor.getString(1));student.setSpeciality(cursor.getString(2));student.setQq(cursor.getString(3));db.close();}return student;}<span style="color:#009900;">/** * 2、查询所有student数据——————使用query方法 *  * @return */</span>public List<Student> queryAll(Student student) {List<Student> sList = new ArrayList<Student>();db = helper.getWritableDatabase();Cursor cursor = db.query("tb_student", null, null, null, null, null,null);while (cursor.moveToNext()) {Student student1 = new Student(cursor.getString(0),cursor.getString(1), cursor.getString(2),cursor.getString(3));sList.add(student1);}return sList;}<span style="color:#009900;">/** * 2、查询单个student数据——————使用query方法 *  * @return */</span>public Student quereyStuden(Student student) {db = helper.getReadableDatabase();Cursor cursor = db.query("tb_student", null, "id=?",new String[] { student.getId() }, null, null, null);// Cursor cursor = db.query("select * from tb_student where Id=?",// new String[] { student.getId() });// 要创建一个Cursor(游标),必须执行一个查询,通过SQL使用rawQuery()方法或是更精心的query()方法,而不能使用execSQL(String// sql)方法。while (cursor.moveToNext()) {student.setId(cursor.getString(cursor.getColumnIndex("id")));// 返回指定列的名称,如果不存在返回-1// student.setId(cursor.getString(0));student.setName(cursor.getString(1));student.setSpeciality(cursor.getString(2));student.setQq(cursor.getString(3));db.close();}return student;}<span style="color:#009900;">/** * 删除一条数据 * @param name * @return */</span>public int delete(String name){db = helper.getReadableDatabase();int nu=db.delete("tb_student", "name=?", new String[]{name});db.close();return nu;}}

需要注意的是使用COntentValues类,该类用于放置参数,它的底层是使用Map集合实现的,key表示插入数据的列名,value表示要插入的数据。

db.execSQL("insert into tb_student values(?,?,?,?)", new String[] {
student.getId(), student.getName(), student.getSpeciality(),
student.getQq() });

第一个参数表示要执行的SQL语句,并这里用占位符表示参数,第二个参数表示占位符对应的参数

查询数据首先要获得一个可读的SQLiteDatabase对象。SQLiteDatabase提供了两个用于查询数据的方法,一个是rawQuery()方法,另一个是query()方法,上面方法中分别对这两种方法的单个查询与所有查询都做了详细的介绍

接下来是具体的测试实现代码,为了方便起见我都把它写在了主类中,其对于的方法我都做了注释,对于代码如下:

SQLite02Activity.java

package com.abc.sqlite;import java.util.ArrayList;import java.util.List;import com.abc.dao.StudentDAO;import com.abc.entity.Student;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.widget.TextView;public class SQLite02Activity extends Activity {TextView textView = null;List<Student> listStudents = new ArrayList<Student>();public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);textView = (TextView) findViewById(R.id.tv);StudentDAO studentDAO = new StudentDAO(this);Student s1 = new Student("1", "aaa", "aa", "1111111");Student s4 = new Student("14", "mx15", "5", "android");// 1、添加数据/* * students.add(s1); students.add(s2); //增强for循环,循环显示 for  * (Student s :students) { StudentDAO stu = new StudentDAO(this); //stu.add(s); * stu.addContentValues(s); } */// 2、使用rawquery查询所有student数据/*textView.setText( studentDAO.quereyTable().get(0).getName()); */// 3、查询单个student数据/*Student studentmx=studentDAO.quereyStudentRaw(s4);textView.setText(studentmx.getId() + "***"+ studentmx.getName() + "***"+ studentmx.getQq() + "***"+ studentmx.getSpeciality());      */// 4、使用query查询所有student数据  Student studentmx=studentDAO.quereyStudentRaw(s4);  textView.setText(studentmx.getName()+":"+studentmx.getQq());//5、使用query查询单个student数据/*Student studentmx=studentDAO.quereyStuden(s4);textView.setText(studentmx.getId() + "***"+ studentmx.getName() + "***"+ studentmx.getQq() + "***"+ studentmx.getSpeciality());*/}}

在这里特别提醒一下存储的机制:

区别:contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象。

在向数据库中插入数据的时候,首先应该有一个ContentValues的对象所以:

ContentValues initialValues = new ContentValues();

initialValues.put(key,values);

SQLiteDataBase sdb ;//新建SQLiteDataBase对象

sdb.insert(database_name,null,initialValues);

插入成功就返回记录的id否则返回-1;

HashMap和HashTable..

HashMap不是线程安全的,HashTable是线程安全的一个Collection。HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。HashMap允许null key和null value,而hashtable不允许

项目资源下载










2 0