SQLite是一个轻量级的嵌入式数据库引擎,它支持SQL语言,并且占用很少的内存就可以有很好的性能。它与其他数据库的最大的不同就是对数据类型的支持,创建一个表时,可以在CREATE TABLE语句中指定某列的数据类型,但是可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite将检查它的数据类型。如果该类型和关联的列不匹配,那么SQLite会尝试将该值转换成该列的数据类型,如果不能转换,那么该值将作为其本身具有的数据类型存储。对于Android平台来说,系统内置了丰富的API(SQLiteDatabase、SQLiteOpenHelper,Cursor等)来供我们操作SQLite。那么接下来我将会结合我的代码来讲述我对Android数据库的理解。
1.实体类(正如我在上一篇博客写ListView的适配器的时候,我把每个item里面的所有的适配内容封装成一个实体类一样,我同样可以把数据库里面每一组数据封装成为一个实体)
public class LianxirenBean {
private String name;
private String number;
private String introduce;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getIntroduce() {
return introduce;
}
public void setIntroduce(String introduce) {
this.introduce = introduce;
}
public LianxirenBean() {
super();
}
public LianxirenBean(String name, String number, String introduce) {
super();
this.name = name;
this.number = number;
this.introduce = introduce;
}
}
2.class继承SQLiteOpenHelper建一个表
首先我先建一个测试类来看看继承SQLiteOpenHelper类之后的代码结构是怎样的。
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class TestClass extends SQLiteOpenHelper {
public TestClass(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
这里实现了三个方法:
1.构造函数:里面有四个参数:Context(上下文环境,比如说Activity)、name(数据库的名字)、factory(一个可选的有表工厂,通常是null)、version(当前正在使用的数据库模型版本号)。
2.onCreate()方法:它需要传入一个SQLiteDataBase对象作为参数,对这个对象填充表和初始化数据。
3.onUpdate()方法:它需要三个参数,一个是SQLiteDataBase的对象,一个数据库旧版本号,一个新版本数据库版本号。实现把一个旧的数据库转变成新的数据库。
其中,name参数表示数据库文件名,SQLiteOpenHelper会根据这个文件名首先进行检测是否存在该数据库,如果不存在,那么就会以这个名字创建一个数据库文件。version表示数据库的版本号,如果当前传入的数据库版本号比上次创建或升级的版本号高,那么SQLiteOpenHelper就会调用onUpdate()方法。
然后大概把书本上的内容誊抄了一下,想必这些东西大家也都有了解,也不赘述。
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class LianxirenOpenHelper extends SQLiteOpenHelper {
public static final String CREATE_USERDATA = "create table lxrData(name varchar(200) primary key,number varchar(200),introduce varchar(200))";
private Context mContext;
public LianxirenOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory cursorFactory, int version) {
super(context, name, cursorFactory, version);
mContext = context;
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_USERDATA);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
3.数据库操作类
完成数据库的建表工作之后,我们还需要的就是完成对表的增删该查等等操作,那么这些操作当然也可以直接放在Activity里面去做,但是这样的话会不会未免使自己的代码看起来特别的庞杂了呢,而且如果说在另外一个Activity里面也想要对表进行操作,难道还需要再写一遍么,自然,用一个数据库操作类把所有可能会对表操作的方法进行封装是很有必要的。
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import dxxy_swy_Bean.LianxirenBean;
import dxxy_swy_OpenHelper.LianxirenOpenHelper;
public class LianxirenOperator {
private LianxirenOpenHelper dbHelper;
private SQLiteDatabase db;
public LianxirenOperator(Context context) {
dbHelper = new LianxirenOpenHelper(context, "lxrData", null, 1);
db = dbHelper.getWritableDatabase();
}
// 添加联系人
public void add(LianxirenBean lxr) {
db.execSQL("insert into lxrData values(?,?,?)",
new Object[] { lxr.getName(), lxr.getNumber(), lxr.getIntroduce() });
}
// 修改联系人
public void update(LianxirenBean lxr) {
db.execSQL("update lxrData set number=?,introduce=? where name=?",
new Object[] { lxr.getNumber(), lxr.getIntroduce(), lxr.getName() });
}
// 删除联系人
public void delete(String name) {
db.execSQL("delete from lxrData where name=?", new String[] { name });
}
// 查询联系人
public LianxirenBean queryOne(String name) {
LianxirenBean lxr = new LianxirenBean();
Cursor c = db.rawQuery("select * from lxrData where name= ?", new String[] { name });
while (c.moveToNext()) {
lxr.setName(c.getString(0));
lxr.setNumber(c.getString(1));
lxr.setIntroduce(c.getString(2));
}
c.close();
return lxr;
}
public List queryAlllxr() {
ArrayList lxrs = new ArrayList();
Cursor c = db.rawQuery("select name from lxrData", null);
while (c.moveToNext()) {
LianxirenBean lxr = new LianxirenBean();
lxr.setName(c.getString(0));
lxrs.add(lxr);
}
c.close();
return lxrs;
}
// 查询所有的联系人信息
public List queryMany() {
ArrayList lxrs = new ArrayList();
Cursor c = db.rawQuery("select * from lxrData", null);
while (c.moveToNext()) {
LianxirenBean lxr = new LianxirenBean();
lxr.setName(c.getString(0));
lxr.setNumber(c.getString(1));
lxr.setIntroduce(c.getString(2));
lxrs.add(lxr);
}
c.close();
return lxrs;
}
// 检验用户名是否已存在
public boolean CheckIsDataAlreadyInDBorNot(String value) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
String Query = "Select * from lxrData where name =?";
Cursor cursor = db.rawQuery(Query, new String[] { value });
if (cursor.getCount() > 0) {
cursor.close();
return true;
}
cursor.close();
return false;
}
// 判断信息是否已经存在
public boolean Dataexist(String name, String number, String introduce) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
String Query = "Select * from lxrData where name =? and number=? and introduce=?";
Cursor cursor = db.rawQuery(Query, new String[] { name, number, introduce });
if (cursor.getCount() > 0) {
cursor.close();
return true;
}
cursor.close();
return false;
}
}
在上面的代码中,先是定义了操作类的构造函数,在构造函数里面又对OpenHelper进行了实例化,也是在这个地方我们定义了OpenHelper的构造函数里面的四个参数。这样的话,就相当于完成了数据库操作类和相应数据库的“绑定”操作。就相当于说在任何一个Context(比如说Activity)之中实例化数据库操作类的对象,那么就可以对我的表进行操作。这样的话,不同的Activity要对同一个表进行操作就变得非常简单了。然后下面的代码里面是我根据我的代码的需要定义了一些“增删改查”的操作。
4.在Activity中调用数据库操作类实现对数据库的操作
完成了上面三个步骤之后,就相当于说准备工作完成了,那么我们还需要在Activity中完成我们对表的操作。接下来我将会用步骤的形式来说明具体的操作。
(1)定义数据库操作类的对象并进行初始化。
private LianxirenOperator lxrOperator;
lxrOperator = new LianxirenOperator(this);
(2)利用数据库操作类的对象结合我们写的“增删改查”代码实现操作。我这里就选取我的代码里边的关键的逻辑,当然这四个代码部分还需要对照着我在数据库操作类中写的代码。
“增”:
LianxirenBean lxr = new LianxirenBean();
lxr.setName(addname);
lxr.setNumber(addnumber);
lxr.setIntroduce(addintroduce);
lxrOperator.add(lxr);
“删”:
lxrOperator.delete(et_delete_find_name.getText().toString().trim());
“改”:
LianxirenBean lxr = new LianxirenBean();
lxr.setName(updatename);
lxr.setNumber(updatenumber);
lxr.setIntroduce(updateintroduce);
lxrOperator.update(lxr);
“查”:
LianxirenBean lxr = lxrOperator.queryOne(et_delete_find_name.getText().toString());
然后这里其实也只是举了一些简单的例子来说明对表的操作。
最后呢,还是照例总结一下。就是“三要素”:实体类、建表类、数据库操作类。
然后,写到这里,基本上就是要结束了,在本文中,用到非常多的引用《基于工作任务的Android应用教程》这本书中的一些讲解内容,当然也有个人的一些删减。当然因为我的叙述能力会有欠缺,难免会在某一个地方的叙述有很大的瑕疵甚至错误,欢迎大家在在评论区留言。共同进步!!