Android中使用嵌入式关系型SQLite数据库存储数据


除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。
在Android的平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,
只不过在运算或保存时会转成对应的五种数据类型。
SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么;
SQLite中还可以进行解析不部分的SQL语句,所以用起来挺方便的;
在使用SQLite中,Android系统为什么实现了SQLiteOpenHelper的抽象类,所以我去实现其中的方法,来让我们对数据进行管理创建于版本管理;
在类SQLiteOpenHelper的帮助类是,
我们去实现
onCreate(SQLiteDatabase db), onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)这两个方法
①:
public abstract void onCreate (SQLiteDatabase db) 当数据库第一次被创建的时候去调用,在onCreate()方法里面可以生成数据库表结构和添加一些应用使用到的初始化数据,返回DataBase
②:
public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) 当数据库需要更新的时候调用,调用的时候需要先删除原来的表,或者去更新新的版本号
当然我们还会用到
getReadableDatabase()与个头WritableDatabase()这两个方法来进行获取数据的实例
但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写;
getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,
不过很幸运的时候,加入打开失败,还是继续尝试用只读方式去打开数据库

Demo:以学生信息管理来举例
Student_Model:

package com.jiangqq.model; import java.io.Serializable; /** * 学生类的model类 * * @author jiangqq * */ public class Student implements Serializable { private Integer stu_id; private String name; private String gender; private Short age; private String telphone; public Student() { super(); } public Student(String name, String gender, Short age, String telphone) { super(); this.name = name; this.gender = gender; this.age = age; this.telphone = telphone; } public Student(Integer id, String name, String gender, Short age, String telphone) { super(); this.stu_id = id; this.name = name; this.gender = gender; this.age = age; this.telphone = telphone; } public Integer getId() { return stu_id; } public void setId(Integer id) { this.stu_id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Short getAge() { return age; } public void setAge(Short age) { this.age = age; } public String getTelphone() { return telphone; } public void setTelphone(String telphone) { this.telphone = telphone; } @Override public String toString() { return "Student [id=" + stu_id + ", name=" + name + ", gender=" + gender + ", age=" + age + ", telphone=" + telphone + "]"; } }

首先先写数据库帮助类:

package com.jiangqq.service; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBOpenHelper extends SQLiteOpenHelper { private static final String DB_NAME = "student.db"; private static final int VERSION = 1; private static final String CREATE_TABLE = "create table student (stu_id integer primary key autoincrement,name text,gender text,age integer,telphone text);"; public DBOpenHelper(Context context) { super(context, DB_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS student"); onCreate(db); } }


至此数据库的帮助类已经基本完成,接下来要用SQLiteDatabase类中的方法来对学生信息进行管理了;

基本会用到以上的一个主要的方法:

添加 ①:public long insert (String table, String nullColumnHack, ContentValues values)

values是一个键值对,如果插入成功返回此时新插入的行号,失败返回-1

删除 ②:public int delete (String table, String whereClause, String[] whereArgs)

修改 ③:public int update (String table, ContentValues values, String whereClause, String[] whereArgs)

返回被修改的列数

查询 ④:public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

查询的方法一共有三个重载的方法,其中各种参数意思如下(如果其中某个参数不设置,可以指定为null):

table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。

columns:要查询出来的列名。相当于select语句select关键字后面的部分。

selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”

selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异 常。

groupBy:相当于select语句groupby关键字后面的部分

having:相当于select语句having关键字后面的部分

orderBy:相当于select语句orderby关键字后面的部分

limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分


然后是对学生信息的增删查改的方法类:

package com.jiangqq.service; /** * 该类进行对学生信息的数据库的增删查改操作的封装 */ import java.util.ArrayList; import java.util.List; import com.jiangqq.model.Student; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class DBDatabase { private DBOpenHelper dbOpenHelper; private SQLiteDatabase dbDatabase; public DBDatabase(Context context) { this.dbOpenHelper = new DBOpenHelper(context); } // 添加 public void add(Student student) { dbDatabase = dbOpenHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", student.getName()); values.put("gender", student.getGender()); values.put("age", student.getAge()); values.put("telphone", student.getTelphone()); dbDatabase.insert("student", null, values); if (dbDatabase != null) { dbDatabase.close(); } } // 删除操作 public void delete(Integer id) { dbDatabase = dbOpenHelper.getWritableDatabase(); dbDatabase.delete("student", "stu_id= ? ", new String[] { String.valueOf(id) }); if (dbDatabase != null) { dbDatabase.close(); } } // 修改 public void update(Student student, Integer id) { dbDatabase = dbOpenHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", student.getName()); values.put("gender", student.getGender()); values.put("age", student.getAge()); values.put("telphone", student.getTelphone()); dbDatabase.update("student", values, "stu_id=?", new String[] { String.valueOf(id) }); if (dbDatabase != null) { dbDatabase.close(); } } // 查询 public List<Student> findAll() { dbDatabase = dbOpenHelper.getWritableDatabase(); Cursor cursor = dbDatabase.query("student", new String[] { "stu_id", "name", "gender", "age", "telphone" }, null, null, null, null, "stu_id asc"); List<Student> list = new ArrayList<Student>(); Student student = null; while (cursor.moveToNext()) { student = new Student(); student.setId(cursor.getInt(0)); student.setName(cursor.getString(1)); student.setGender(cursor.getString(2)); student.setAge(cursor.getShort(3)); student.setTelphone(cursor.getString(4)); list.add(student); } if (dbDatabase != null) { dbDatabase.close(); } return list; } public Student findById(Integer id) { dbDatabase = dbOpenHelper.getWritableDatabase(); Cursor cursor = dbDatabase.query("student", new String[] { "stu_id", "name", "gender", "age", "telphone" }, "stu_id=?", new String[] { String.valueOf(id) }, null, null, null); int count = cursor.getCount(); if (count != 0) { cursor.moveToNext(); Student student = new Student(cursor.getInt(cursor .getColumnIndex("stu_id")), cursor.getString(cursor .getColumnIndex("name")), cursor.getString(cursor .getColumnIndex("gender")), cursor.getShort(cursor .getColumnIndex("age")), cursor.getString(cursor .getColumnIndex("telphone"))); if (dbDatabase != null) { dbDatabase.close(); } return student; } else { { return null; } } } }

方法单元测试类:

package com.jiangqq.service.test; import java.util.List; import com.jiangqq.model.Student; import com.jiangqq.service.DBDatabase; import android.test.AndroidTestCase; import android.util.Log; public class SQLiteDatabaseTest extends AndroidTestCase { private static final String TAG = "SQLiteDatabaseTest"; public void testAdd() { Student student = null; DBDatabase database = new DBDatabase(this.getContext()); student = new Student(); student.setName("李华"); student.setGender("男"); student.setAge((short) 20); student.setTelphone("18355101099"); database.add(student); student = new Student(); student.setName("李华"); student.setGender("男"); student.setAge((short) 20); student.setTelphone("18355101099"); database.add(student); Log.i(TAG, "添加成功"); } public void testDelete() { DBDatabase database = new DBDatabase(this.getContext()); database.delete(1); Log.i(TAG, "删除成功"); } public void testUpdate() { DBDatabase database = new DBDatabase(this.getContext()); Student student = new Student("李华", "男", (short) 20, "1388888888"); database.update(student, 1); Log.i(TAG, "修改成功"); } public void testFindAll() { DBDatabase database = new DBDatabase(this.getContext()); List<Student> list = database.findAll(); for (int y = 0; y < list.size(); y++) { // System.out.println(((Student) list.get(y)).toString()); Log.i(TAG, ((Student) list.get(y)).toString()); } } public void testFindById() { DBDatabase database = new DBDatabase(this.getContext()); Student student = database.findById(2); Log.i(TAG, student.toString()); } }

单元测试截图:

Android中使用嵌入式关系型SQLite数据库存储数据


时间仓促,上面还有很多不足,晚些时候还是继续修改一下