对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) { } 引用: SQLiteOpenHelper与SQLiteDataBase的区别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对象 }
通过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() }); }
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() }); }
在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); }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |