Android学习SQLiteDatabase 自带添加、删除、更新、查询的操作方法:实现添加,删除,更新,查询,和分页,统计

Android学习笔记----SQLiteDatabase 自带添加、删除、更新、查询的操作方法:实现添加,删除,更新,查询,和分页,统计

7.除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应n n 于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 。这些 n n 方法实际上是给那些不太了解SQL语法的菜鸟使用的,对于熟悉SQL语法的程序员而言,直接 n n 使用execSQL()和rawQuery()方法执行SQL语句就能完成数据的添加、删除、更新、查询操作 n n 。 --------------------------------------------------------------8.Insert()方法用于添加数据,各个字段的数据使用ContentValues进行存放。 nn n n ContentValues n类似于MAP,相对于MAP,它提供了存取数据对应的put(String key, Xxxn n n value)和 getAsXxx(String key)方法, key为字段名称,value为字段值,Xxx指的是各种n n 常用的数据类型,如:String、Integer等。 SQLiteDatabase db = databaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "credream"); values.put("age", 4); long rowid = db.insert(“person”, null, values);//返回新添记录的行号,与主键id无n n 关不管第三个参数是否包含数据,执行Insert()方法必然会添加一条记录,如果第三个参数为n n 空,会添加一条除主键之外其他字段值为Null的记录。Insert()方法内部实际上通过构造 n n insert SQL语句完成数据的添加,Insert()方法的第二个参数用于指定空值字段的名称,相 n n 信大家对该参数会感到疑惑,该参数的作用是什么?是这样的:如果第三个参数values 为n n Null或者元素个数为0, 由于Insert()方法要求必须添加一条除了主键之外其它字段为Null n n 值的记录,为了满足SQL语法的需要, insert语句必须给定一个字段名,如:insert inton n n person(name) values(NULL),倘若不给定字段名 , insert语句就成了这样: insert inton n n person() values(),显然这不满足标准SQL的语法。对于字段名,建议使用主键之外的字段 n n ,如果使用了INTEGER类型的主键字段,执行类似insert into person(personid) values n n (NULL)的insert语句后,该主键字段值也不会为NULL。如果第三个参数values 不为Null并且 n n 元素的个数大于0 ,可以把第二个参数设置为

null。 --------------------------------------------------------------2.delete()方法的使用: n SQLiteDatabase db = databaseHelper.getWritableDatabase(); n db.delete("person", "personid

/DBSQLIte/src/com/credream/service/OtherPersonService.java package com.credream.service; n n import java.util.ArrayList; import java.util.List; n n import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import

android.database.sqlite.SQLiteDatabase; import com.credream.entity.Person; n n public class OtherPersonService { private DBOpenHelter dbOpenHelter; public OtherPersonService(Context context){ this.dbOpenHelter=new DBOpenHelter(context); } /** * 添加记录* @param person */ public void save (Person person){ SQLiteDatabase db=dbOpenHelter.getWritableDatabase(); //SQLiteDatabase db2=dbOpenHelter.getWritableDatabase(); //这里获得的数据库实例和db这个数据库实例是一样的,因为数据库有缓存 n n 功能 //在源码里进行了判断,如果得到的数据库实例不为null,并且已经打开,并n n 且是只读的,那么//就直接返回这个实例 n n n n //dbOpenHelter.getWritableDatabase().execSQL(sql);这里和

db.execSQL("作用 n n 是一样的 //db.execSQL("insert into person (name,phone) values n n

('"+person.getName()+"','"+person.getPhone()+"')"); n n//上面这种写法是错误的,因为当用户输入

cre'dream的时候那么sql语句就成了 //insert into person (name,phone) values n n

('cre'dream','150********')这样会出现sql语法错误//所以,应该用转义字符 ContentValues values=new ContentValues(); values.put("name", person.getName()); values.put("phone", person.getPhone()); db.insert("person", null, values); //这里第二个字段,是空值字段,如果用户传过去的字段是空集合那么就无n n 法组拼接sql //比如:db.insert("person", "name",null );这时候,就是代表name可以 n n 为

null //insert into person(name) values(NULL); //所以当第三个参数不是null,的时候第二个参数是没用的直接设置为n n null就可以了 //db.insert("person", "personid",null );对应的sql:insert inton n n person(personid) values(NULL); //这时候主键为null,按理说是不正确的,但是sqlite做了处理,这个时候其 n n 实取了主键自增值作为personid的值n //在源代码里,也是通过构造sql语句来完成,数据的添加

的 //db.execSQL("insert into person (name,phone) values(?,?)",newn n n Object[]{person.getName (),person.getPhone()}); //db.close();//数据库也可以不关闭,因为这样的话可以提升性能,因为不用频繁的 n n 开关数据库n } /** * 删除记录* @param person */ public void delete (Integer id)

{ SQLiteDatabase db=dbOpenHelter.getWritableDatabase(); db.delete("person", "personid=?", new String[]{id.toString()}); //这里拼接的时候自动的给加了where不要重复加 //db.execSQL("delete from person nwhere personid=?",new Object[] n n {id}); } /** * 更新记录* @param person */ public void update(Person person){ SQLiteDatabase db=dbOpenHelter.getWritableDatabase(); ContentValues

values=new ContentValues(); values.put("name", person.getName()); values.put("phone",

person.getPhone()); db.update("person", values,"personid=?",new String[] n n {person.getId

().toString()} ); //db.execSQL("update nperson set name=?,phone=? n wheren n n personid=?",new Object[]{person.getName(),person.getPhone(),person.getId()}); n } /** * 查找记录* @param id *

@return */ public Person find (Integer id){ SQLiteDatabase db=dbOpenHelter.getReadableDatabase (); //getReadableDatabase();这个方法里面调用了getWritableDatabase(); n n 方法,来取得数据库操作实例,只有调用 //失败的时候就会发现异常,当数据磁盘满了,会抛出异常,这时候会打开这n n 个实例的数据

库//然后开始读取,这样当磁盘满的时候, //当数据库磁盘空间没有满的时候,返回的数据库操作实例是一样的:可读n n 可写,当数据库磁盘满了,返回的数据库//操作实例是只读的 //Cursor cursor=db.query ("person", new String[]{"personid","name","phone"},n n n "personid=?", new String[]{id.toString ()}, null, null, null); Cursor cursor=db.query("person", null, "personid=?", new String n n [] {id.toString()}, null, null, null); //Passing null will return all columns,第二个参数传入null,将会获n n 取所有的列n //Cursor cursor=db.rawQuery("select * from person nwhere personid=?",new String n n []{id.toString()}); //游标存放结果 if(cursor.moveToFirst()){ int

personid=cursor.getInt(cursor.getColumnIndex("personid")); String name=cursor.getString

(cursor.getColumnIndex("name")); String phone=cursor.getString(cursor.getColumnIndex("phone")); return new Person(personid,name,phone); n }//当有数据会返回true,否则为false cursor.close(); return null; } n //处理分页/** * 分页获取记录* offset:跳过前面几条记录* maxlength:获取几条*/ public List getScrollData(int offset,int MaxResult){ List persons=new

ArrayList(); SQLiteDatabase db=dbOpenHelter.getReadableDatabase(); Cursor cursor=db.query ("person", null, null, null, null,null,n n n "personid asc", offset+","+MaxResult); n //Cursor cursor=db.rawQuery("select * from person order byn n n personid asc limit ?,?", //new String[] {String.valueOf(offset),String.valueOf n n (MaxResult)}); while(cursor.moveToNext()){ int personid=cursor.getInt(cursor.getColumnIndex("personid")); String name=cursor.getString

(cursor.getColumnIndex("name")); String phone=cursor.getString(cursor.getColumnIndex("phone")); persons.add(new Person(personid,name,phone)); } cursor.close(); return persons; } n n public long getCount(){ SQLiteDatabase db=dbOpenHelter.getReadableDatabase(); Cursor cursor=db.query ("person", new String[]{"count(*)"}, null,n n n null, null, null, null); //Cursor

cursor=db.rawQuery("select count(*) from person "n n n ,null); //select count(*) from person注意这里至少会获得一条数据 cursor.moveToFirst(); long result=cursor.getLong(0); return result; } n n n } ---------------------------------------------------

/DBSQLIte/src/com/credream/test/OtherPersonServiceTest.java package com.credream.test; n n import java.util.List; n n import com.credream.entity.Person; import com.credream.service.DBOpenHelter; import com.credream.service.OtherPersonService; import com.credream.service.PersonService; n n import android.test.AndroidTestCase; import android.util.Log; n n public class OtherPersonServiceTest extends AndroidTestCase { //PersonService service=new PersonService

(this.getContext()); //不可以写到这里,因为这段代码是在实例化过程中被调用的,如果刚刚开始的就直 n n 接实例化这个对象 //这时候是取不到上下文对象的,只有实例化过后才可以获取上下文对象 //如果非要把这个单独拿出来的话,可以写到setUp()方法里面,因为每个方法执行之 n n 前都会首先执行这个方法 private static final String TAG="PersonServiceTest"; //创建数据库,在<包>/database/ public void testCreateDB()throws Exception{ DBOpenHelter dbOpenHelter=new DBOpenHelter(getContext()); dbOpenHelter.getWritableDatabase(); } public void testSave()throws Exception{ OtherPersonService service=new OtherPersonService n n (this.getContext()); //for(int i=0;i<20;i++){ //Person

person=new Person("lidewei"+i,"151********"+i); Person person=new Person ("xiaoyue","151********"); service.save(person); //} } public void testUpdate()throws Exception { OtherPersonService service=new OtherPersonService n n (this.getContext()); Person

person=service.find(1); person.setName("mydream"); service.update(person); n } n n public void testDelete()throws Exception{ OtherPersonService service=new OtherPersonService n n

(this.getContext()); service.delete(22); } n n public void testFind()throws Exception

{ OtherPersonService service=new OtherPersonService n n (this.getContext()); Person

person=service.find(1); Log.i(TAG,person.toString()); n } n n public void testScrollData()throws Exception{ OtherPersonService service=new OtherPersonService n n (this.getContext());

List persons= service.getScrollData(0, 50); for(Person person :persons){ Log.i

(TAG,person.toString()); } //翻到第2页n } public void testCount()throws Exception

{ OtherPersonService service=new OtherPersonService n n (this.getContext()); long

result=service.getCount(); Log.i(TAG, result+""); n } //除了以上的数据库操作为,还为我们提供了专门方法: n n n } ---------------------------------------------------------

/DBSQLIte/src/com/credream/service/DBOpenHelter.java package com.credream.service; n n import android.content.Context; import android.database.sqlite.SQLiteDatabase; import

android.database.sqlite.SQLiteOpenHelper; import

android.database.sqlite.SQLiteDatabase.CursorFactory; n n public class DBOpenHelter extends SQLiteOpenHelper { //父类没有默认构造器,需要显示调用 public DBOpenHelter(Context context) { super (context, "credream.db", null, 2); //数据库创建完成后,默认会保存在<包>/database/文件夹下 //当修改版本号时候,会触发:onUpgrade方法 //第二个:指定数据库名称, //第三个:游标工厂,用来迭代,查询后的结果集,null代表使用系统默认的 n n 游标工厂//版本号,大于0 n } /** n* 这个方法是在数据库第一次被创建的时候调用的 n*/ @Override public void onCreate(SQLiteDatabase db) { //SQLiteDatabase这个类,封装了增删改查操作,也叫做数据库操作实例 db.execSQL("CREATE TABLE person (personid integer primary keyn n n autoincrement, name varchar(20))"); //这里也可以不写name的数据类型,因为sqlite是数据类型无关的,就是写n n 了varchar(20),也可以写入超过20的内容 n n } /** n* 当数据库的版本号变更的时候被调用 n*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{ db.execSQL("alter table person add phone varchar(12) null"); n n }

相关文档
最新文档