对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),"

                               +"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 getScrollData(int start, int count) {

               Listtb_inaccount = new ArrayList();

               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从入门到经典》的案列代码。上述中的分析重要是我对网上信息的汇总和我自己对代码的分析。

 

 

你可能感兴趣的:(android)