对SQLite数据库应用的代码解析
一、数据库的创建
packagecom.xiaoke.accountsoft.dao;
import android.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
public class DBOpenHelper extendsSQLiteOpenHelper {
privatestatic final int VERSION = 1;//定义数据库版本号
privatestatic final String DBNAME = "account.db";//定义数据库名
publicDBOpenHelper(Context context) {
super(context,DBNAME, null, VERSION);
//TODO Auto-generated constructor stub
}
@Override
publicvoid onCreate(SQLiteDatabase db) {//创建数据库
//TODO Auto-generated method stub
db.execSQL("createtable tb_outccount(_id integer primary key,"
+"money decimal,time varchar(10),type varchar(10),addressvarchar(100),"
+"mark varchar(200))");//创建数据表
db.execSQL("createtable tb_inaccount(_id integer primary key,"
+"money decimal,time varchar(10),type varchar(10),handlercarchar(100),"
+"mark varchar(200))");
db.execSQL("createtable tb_pwd(password varchar(20))");
db.execSQL("craatetable tb_flag(_id integer primary key,flag varchar(200))");
}
@Override
publicvoid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//TODO Auto-generated method stub
}
}
引用:
SQLiteOpenHelper与SQLiteDataBase的区别SQLiteDatabase是Android SDK中操作数据库的核心类之一。使用SQLiteDatabase可以打开数据库,也可以对数据库进行操作。然而为了数据库升级的需要以及使用更方便,往往使用SQLiteOpenHelper的子类来完成创建、打开数据库及各种数据库操作。SQLiteOpenHelper是个抽象类,在该类中有如下两个抽象方法,SQLiteOpenHelper的子类必须实现这两个方法。public abstractvoid onCreate(SQLiteDatabase db);public abstract void onUpdate(SQLiteDatabasedb,int oldVersion,int newVersion);SQLiteOpenHelper会自动检测数据库文件是否存在。如果存在,会打开这个数据库,在这种情况下就不会调用onCreate()方法。如果数据库文件不存在,SQLiteOpenHelper首先会创建一个数据库文件,然后打开这个数据库,最后调用onCreate()方法。因此,onCreate()方法一般用来在新创建的数据库中建立表、视图等数据库组建。也就是说oncreate()方法在数据库文件第一次创建时调用。先看看SQLiteOpenHelper类的构造方法再解释onUpdate()方法何时会被调用。publicSQLiteOpenHelper(Context context,String name,CursorFactory factory,intversion);其中name参数表示数据库文件名(不包括文件路径),SQLiteOpenHelper会根据这个文件名创建数据库文件。version表示数据库的版本号。如果当前传入的数据库版本号比上次创建或升级的版本号高,SQLiteOpenHelper就会调用onUpdate()方法。也就是说,当数据库第一次创建时会有一个初始的版本号。当需要对数据库中的表、视图等组建升级时可以增大版本号,再重新创建它们。现在总结一下oncreate()和onUpdate()调用过程。1.如果数据库文件不存在,SQLiteOpenHelper在自动创建数据库后会调用oncreate()方法,在该方法中一般需要创建表、视图等组件。在创建前数据库一般是空的,因此不需要先删除数据库中相关的组件。2.如果数据库文件存在,并且当前版本号高于上次创建或升级的版本号,SQLiteOpenHelper会调用onUpdate()方法,调用该方法后会更新数据库的版本号。在onupdate()方法中除了创建表、视图等组件外,还需要先删除这些相关的组件,因此,在调用onupdate()方法前,数据库是存在的,里面还原许多数据库组建。综合上述两点,可以得出一个结论。如果数据库文件不存在,只有oncreate()被调用(该方法在创建数据库时被调用一次)。如果数据库文件存在,会调用onupdate()方法升级数据库,并更新版本号。
二、数据库的操作
对数据库的操作,主要是数据库添加记录,更新数据库数据,查找数据库信息,删除数据记录,获取指定的数据内容,获取数据记录数等。
private DBOpenHelper helper;//创建DBOpenHelper对象
privateSQLiteDatabase db;//创建SQLiteDatabase对象
publicInaccountDAO(Context context) {
helper= new DBOpenHelper(context);//初始化DBOpenHelper对象
}
1、为数据库添加记录
通过execSQL 执行添加数据的SQL命令:插入数据的命令及格式 INSERT [INTO] 表名 [(列名列表)] VALUES({表达式})
/**
* 添加记录,
* @param tb_inaccount
*/
publicvoid add(Tb_inaccount tb_inaccount) {
db= helper.getWritableDatabase();//以写的方式初始化SQLiteDatabase对象
db.execSQL(
"insertinto tb_inaccount (_id,moeny,time,type,handler,mark)"
+"values (?,?,?,?,?)",
newObject[] { tb_inaccount.getId(), tb_inaccount.getMoney(),
tb_inaccount.getTime(),tb_inaccount.getType(),
tb_inaccount.getHandler(),tb_inaccount.getMark() });
}
在用execSQL行SQL语句时用”?”作为变量的引用。
2、添加更新数据的方法
UPDATE 表名
SET 列名=值,....
WHERE 子句 用来修改指定的行
/**
* 更新信息 * @param tb_inaccount
*/
publicvoid update(Tb_inaccount tb_inaccount) {
db= helper.getWritableDatabase();
db.execSQL(
"updatetb_inaccount set money = ?,time = ?,type = ?,handler = ?,mark = ? where _id =?",
newObject[] { tb_inaccount.getMoney(), tb_inaccount.getTime(),
tb_inaccount.getType(),tb_inaccount.getHandler(),
tb_inaccount.getMark(),tb_inaccount.getId() });
}
3、根据编号查找指定的信息
在android中使用execSQL来执行语句,但是这个语句是没有返回值的,因此要用Cursor来存储返回的信息,将rawQuery获取的数据库信息存放在Cursor对象中,来实现查询的内容。SELECT 字段列表[INTO 目标数据表]FROM 源数据表[WHERE 条件表达式]其他的属性还有很多,等用到了再分析。
/**
* 查找信息
* @param id
* @return
*/
publicTb_inaccount find(int id) {
db= helper.getWritableDatabase();
Cursorcursor = db
.rawQuery(
"select_id,moeny,time,type,handler,mark from tb_inccount where _id =?",//根据编号查询
newString[] { String.valueOf(id) });
if(cursor.moveToNext()) {//遍历查找到的信息
returnnew Tb_inaccount(
cursor.getInt(cursor.getColumnIndex("_id")),
cursor.getDouble(cursor.getColumnIndex("moeny")),
cursor.getString(cursor.getColumnIndex("time")),
cursor.getString(cursor.getColumnIndex("type")),
cursor.getString(cursor.getColumnIndex("handler")),
cursor.getString(cursor.getColumnIndex("mark")));
}
returnnull;
}
4、删除信息DELETE [FROM] 表名
WHERE 删选条件 ①StringBuffer与append方法 Stringbuffer 有append()方法 Stringbuffer其实是动态字符串数组 append()是往动态字符串数组添加,跟“xxxx”+“yyyy”相当那个‘+’号跟String不同的是Stringbuffer是放一起的 String1+String2 和Stringbuffer1.append("yyyy")虽然打印效果一样,但在内存中表示却不一样 String1+String2 存在于不同的两个地址内存Stringbuffer1.append(Stringbuffer2)放再一起。StringBuffer里面的方法吧,字符缓冲对象追加信息比如说:StringBuffer sb=newStringBuffer();现在sb里面什么也没有sb.append("abc");可以将字符串abc追加进sb里面.你打印sb会打印出abc当然你还可以拉着追加。
/**
* 删除信息
* @param ids
*/
publicvoid delete(integer... ids) {
if(ids.length > 0) {
StringBuffersb = new StringBuffer();
for(int i = 0; i < ids.length; i++) {
sb.append("?").append(",");
}
sb.deleteCharAt(sb.length()- 1);
db= helper.getWritableDatabase();
db.execSQL("deletefrom tb_inaccount where _id in (" + sb + ")",
(Object[])ids);
}
}
5、指定索引处获取指定的数据
①、泛型类是用一个占位符表示数据类型,达到定义一个类,但是参数可以是多种类型,例如String、 Integer等。 ②、泛型类的定义 泛型类的定义和常用类的定义是相同的,知识用占位符表示数据类型。
classBox
private T t;
void set(T t){
this.t=t;
} }
③、泛型的使用
泛型类的使用和常用类的使用也是相同的,都要实例化对象。泛型的参数不能是基本是基本数据类型(int 、char等)。
private String t;
t=newBox
t.set("wo");
④、泛型的功能
泛型主要用来用来定义数据类型的多变场合中,例如处理数据库中的密码,密码类型有的是int[]型的,有的是String型的。
/**
* 获取信息表
* @param start 起始位置
* @param count 每页显示数量
* @return
*/
publicList
List
db= helper.getWritableDatabase();
Cursorcursor = db.rawQuery("select * from tb_inaccount limit ?,?",
newString[] { String.valueOf(start), String.valueOf(count) });
while(cursor.moveToNext()) {
tb_inaccount.add(newTb_inaccount(cursor.getInt(cursor
.getColumnIndex("_id")),cursor.getDouble(cursor
.getColumnIndex("money")),cursor.getString(cursor
.getColumnIndex("time")),cursor.getString(cursor
.getColumnIndex("type")),cursor.getString(cursor
.getColumnIndex("handler")),cursor.getString(cursor
.getColumnIndex("mark"))));
}
returntb_inaccount;
}
6、获取表中数据记录量和最大编号
/**
* 获取数据表中的总记录数
* @return
*/
publiclong getCount() {
db= helper.getWritableDatabase();
Cursorcursor = db.rawQuery("select count(_id)from tb_inaccount", null);
if(cursor.moveToNext()) {
returncursor.getLong(0);
}
return0;
}
/**
* 获取数据表中的最大编号
* @return
*/
publicint getMaxId() {
db= helper.getWritableDatabase();
Cursorcursor = db.rawQuery("select max(_id)from tb_inaccount", null);
while(cursor.moveToNext()) {
returncursor.getInt(0);
}
return0;
}
}
总结:以上分析中只是对特殊语法或类进行了分析,源码是《Android从入门到经典》的案列代码。上述中的分析重要是我对网上信息的汇总和我自己对代码的分析。