对SQLite数据库应用的代码解析

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),240)"> +"mark varchar(200))");//创建数据表

db.execsql("createtable tb_inaccount(_id integer primary key,handlercarchar(100),240)"> +"mark varchar(200))");

db.execsql("createtable tb_pwd(password varchar(20))");

db.execsql("craatetable tb_flag(_id integer primary key,flag varchar(200))");

}

publicvoid onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {

}

引用:

sqliteOpenHelpersqliteDataBase的区别sqliteDatabase是Android SDK中操作数据库的核心类之一。使用sqliteDatabase可以打开数据库,也可以对数据库进行操作。然而为了数据库升级的需要以及使用更方便,往往使用sqliteOpenHelper的子类来完成创建、打开数据库及各种数据库操作。sqliteOpenHelper是个抽象类,在该类中有如下两个抽象方法sqliteOpenHelper的子类必须实现这两个方法。public abstractvoid onCreate(sqliteDatabase db);public abstract void onUpdate(sqliteDatabasedb,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(),240)"> tb_inaccount.getTime(),tb_inaccount.getType(),240)"> tb_inaccount.getHandler(),tb_inaccount.getMark() });

}


在用execsqlsql语句时用”?”作为变量的引用。

2添加更新数据的方法

UPDATE 表名

SET 列名=值,....

WHERE 子句 用来修改指定的行

* 更新信息 * @param tb_inaccount

publicvoid update(Tb_inaccount tb_inaccount) {

db= helper.getWritableDatabase();

"updatetb_inaccount set money = ?,time = ?,type = ?,handler = ?,mark = ? where _id =?",240)"> newObject[] { tb_inaccount.getMoney(),tb_inaccount.getTime(),240)"> tb_inaccount.getType(),tb_inaccount.getHandler(),240)"> tb_inaccount.getMark(),tb_inaccount.getId() });

}


3、根据编号查找指定的信息

在android中使用execsql来执行语句,但是这个语句是没有返回值的,因此要用Cursor来存储返回的信息,将rawQuery获取数据库信息存放在Cursor对象中,来实现查询内容。SELECT 字段列表[INTO 目标数据表]FROM 源数据表[WHERE 条件表达式]其他的属性还有很多,等用到了再分析。

* 查找信息

* @param id

* @return

publicTb_inaccount find(int id) {

Cursorcursor = db

.rawQuery(

"select_id,mark from tb_inccount where _id =?",//根据编号查询

newString[] { String.valueOf(id) });

if(cursor.movetoNext()) {//遍历查找到的信息

returnnew Tb_inaccount(

cursor.getInt(cursor.getColumnIndex("_id")),240)"> cursor.getDouble(cursor.getColumnIndex("moeny")),240)"> cursor.getString(cursor.getColumnIndex("time")),240)"> cursor.getString(cursor.getColumnIndex("type")),240)"> cursor.getString(cursor.getColumnIndex("handler")),240)"> 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.execsql("deletefrom tb_inaccount where _id in (" + sb + ")",240)"> (Object[])ids);

}

5、指定索引处获取指定的数据

①、泛型类是用一个占位符表示数据类型,达到定义一个类,但是参数可以是多种类型,例如String、 Integer等。 ②、泛型类的定义 泛型类的定义和常用类的定义是相同的,知识用占位符表示数据类型。

classBox<T>{

private T t;

void set(T t){

this.t=t;

} }

③、泛型的使用

泛型类的使用和常用类的使用也是相同的,都要实例化对象。泛型的参数不能是基本是基本数据类型(int 、char等)。

private String t

t=newBox<String>();

t.set("wo");

④、泛型的功能

泛型主要用来用来定义数据类型的多变场合中,例如处理数据库中的密码,密码类型有的是int[]型的,有的是String型的。

* 获取信息表

* @param start 起始位置

* @param count 每页显示数量

publicList<Tb_inaccount> getScrollData(int start,int count) {

List<Tb_inaccount>tb_inaccount = new ArrayList<Tb_inaccount>();

Cursorcursor = db.rawQuery("select * from tb_inaccount limit ?,?",240)"> 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")),240)"> .getColumnIndex("type")),240)"> .getColumnIndex("handler")),240)"> .getColumnIndex("mark"))));

returntb_inaccount;

}

6获取表中数据记录量和最大编号

* 获取数据表中的总记录数

publiclong getCount() {

Cursorcursor = db.rawQuery("select count(_id)from tb_inaccount",null);

if(cursor.movetoNext()) {

returncursor.getLong(0);

return0;

* 获取数据表中的最大编号

publicint getMaxId() {

Cursorcursor = db.rawQuery("select max(_id)from tb_inaccount",240)"> returncursor.getInt(0);

}


总结:以上分析中只是对特殊语法或类进行了分析,源码是《Android从入门到经典》的案列代码。上述中的分析重要是我对网上信息的汇总和我自己对代码的分析。

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能