sqlite使用与simpleCursorAdapter展现

sqlite使用与simpleCursorAdapter展现,第1张

概述如何将sqlite数据库文件与apk文件一起发布? 将数据库文件复制到 res目录下的aw目录下.在aw目录下的文件不会被压缩. 如何打开res aw目录下的数据库文件? 当Activity开始创建的时候,将该目录下的文件使用流的形式复制到手机的sd卡中,然后通SQLiteDatabase.openOrCreateDatabase 打开任意目录下的数据库文件. 现在使用sqlite: 使用sqli

如何将sqlite数据库文件与apk文件一起发布?
将数据库文件复制到 res目录下的aw目录下.在aw目录下的文件不会被压缩.

如何打开res aw目录下的数据库文件?
当Activity开始创建的时候,将该目录下的文件使用流的形式复制到手机的sd卡中,然后通sqliteDatabase.openorCreateDatabase 打开任意目录下的数据库文件.

现在使用sqlite:

使用sqlite,无非进行增删改查.
首先,自定义类继承sqliteOpenHelper
覆写其中的onCreate与onUpgrade方法.
其中onCreate方法 第一次创建数据库时调用的方法,一般用于创建数据库与初始化数据库中的数据.

实例代码:(此处将该类设计成单例模式)

public static final String DB_name="person";public static final int VERSION=1;public static final String DB_name="person";public static final int VERSION=1;    public static final String CREATE_table="create table if not exists "+DB_name+" ("    +"   _ID integer primary key autoINCREMENT,"       +"   name varchar(20) unique,"       +"   age integer(3) default 1 check (age between 1 and 150),"        +"   address varchar(200)"    +" )";//数据库第一次创建时调用public voID onCreate(sqliteDatabase db) {    // Todo auto-generated method stub     db.execsql(CREATE_table);}//数据版本更新时调用public voID onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {    String sql="drop table if exists "+DB_name;    db.execsql(sql);    onCreate(db);}

sqlite进行数据库 *** 作,存在两种方法:
一种是调用 db的 execsql 方法,rawquery方法.
另一种是调用 db的update insert delete query 方法.

现在分别进行演示:

增加:

public voID save(Person p){    sqliteDatabase base=db.getWritableDatabase();    try {        String sql="insert into person values(null,?,?)";        base.execsql(sql,new Object[]{p.getname(),p.getAge(),p.getAddress()});    } catch (sqlException e) {        // Todo auto-generated catch block        e.printstacktrace();    }finally{        if(base!=null){            base.close();        }    }}

删除:

public voID delete(Person p){    sqliteDatabase base=db.getWritableDatabase();    try {        String sql="delete from person where _ID=?";        base.execsql(sql,new Object[]{p.get_ID()});    } catch (sqlException e) {        // Todo auto-generated catch block        e.printstacktrace();    }finally{        if(base!=null){            base.close();        }    }}

该:

public voID update(Person p){    sqliteDatabase base=db.getWritableDatabase();    try {        String sql="update person  set name=?,age=?,address=? where _ID=?";        base.execsql(sql,p.getAddress(),p.get_ID()});    } catch (sqlException e) {        // Todo auto-generated catch block        e.printstacktrace();    }finally{        if(base!=null){            base.close();        }    }}

查:

public List<Person> query(){    sqliteDatabase base=db.getWritableDatabase();    String sql="select * from person";    Cursor cursor=base.rawquery(sql,null);    List<Person> persons=new ArrayList<Person>();    while(cursor.movetoNext()){        int _ID=cursor.getInt(cursor.getColumnIndexOrThrow("_ID"));        String name=cursor.getString(cursor.getColumnIndexOrThrow("name"));        int age=cursor.getInt(cursor.getColumnIndexOrThrow("age"));        String address=cursor.getString(cursor.getColumnIndexOrThrow("address"));        Person p=new Person(_ID,name,age,address);        persons.add(p);    }    return persons;}

调用db系统给定的API进行 *** 作:

增:

public voID save(Person p){    sqliteDatabase base=db.getWritableDatabase();    ContentValues values=new ContentValues();    values.put("name",p.getname());    values.put("_ID",p.get_ID());    values.put("age",p.getAge());    values.put("address",p.getAddress());    base.insert("person","name",values);}//inert 的第二个参数通常被称为钩子列,主要的作用:当传入的ContentValues 的值恰好为空的时候,base在底层拼接SQL语句的时候或会出现  insert into person null values null 的情况,然后就会报错,通过钩子列的使用,当传入的数据为空的时候,SQL语句好歹也会变成  insert into person (name) values null这样就不会报异常了,所以钩子列一般对付数据为空的情况.

删:

public voID delete(Person p){    sqliteDatabase base=db.getWritableDatabase();    base.delete("person","_ID=?",new String[]{p.get_ID()+""});}

改:

public voID update(Person p){    sqliteDatabase base=db.getWritableDatabase();    ContentValues values=new ContentValues();    values.put("name",p.getname());    values.put("age",p.getAddress());    base.update("person",values,new String[]{p.get_ID()+""});}

查:

public  List<Person> query(){    sqliteDatabase base=db.getWritableDatabase();    Cursor cursor=base.query("person",null,address);        persons.add(p);    }    return persons;}

此外,对于sqlite,还提供了替换的 *** 作,替换的时候,会先检查数据库中是否已经存在数据,如果存在,则更新数据,如果不存在,则插入数据.而判断是否是同一条数据的依据是设置了unique约束字段的组合是否相同.

public voID replace(headInfo info){    sqliteDatabase base=hepler.getWritableDatabase();    ContentValues values=new ContentValues();    values.put(headInfo.CreateTime,info.getCreate_time());    values.put(headInfo.descriPtion,info.getDescription());    values.put(headInfo.ID,info.getID());    values.put(headInfo.Nickname,info.getNickname());    base.replace(headInfo.tablename,headInfo.Nickname,values);}

完成数据的 *** 作类之后,我们要使用ListvIEw搭配SimpleCursorAdapter进行数据的展现.

ListvIEw进行数据的初始化时,向数据库中查询数据.
然后更新界面.

界面展现/更新的代码:
获取查询结果的游标,作为参数传给简单游标适配器.
ListvIEw如果需要重新刷新界面,更新数据展现,都需要重新从数据库中查询数据,获取游标,然后重新定义适配器,ListvIEw重新配置适配器:

cursor=util.query_Cursor();                adapter=new SimpleCursorAdapter(MainActivity.this,R.layout.item,cursor,new String[]{"name","age","address"},new int[]{R.ID.text_name,R.ID.text_age,R.ID.text_address}); ListvIEw.setAdapter(adapter);

例如点击按钮,添加数据,刷新界面:

if((!TextUtils.isEmpty(name))&&(!TextUtils.isEmpty(age))&&(!TextUtils.isEmpty(address))){Person p=new Person();p.setAddress(address);p.setname(name);p.setAge(Integer.parseInt(age));util.save(p);//更新界面cursor=util.query_Cursor();adapter=new SimpleCursorAdapter(MainActivity.this,R.ID.text_address});ListvIEw.setAdapter(adapter);

删除数据:
处理ListvIEw长按删除事件:

this.ListvIEw.setonItemLongClickListener(new OnItemLongClickListener() {        public boolean onItemLongClick(AdapterVIEw<?> parent,VIEw vIEw,int position,long ID) {cursor=(Cursor) adapter.getItem(position); int _ID=cursor.getInt(cursor.getColumnIndexOrThrow("_ID"));            String sql="delete from person where _ID=?";            sqliteDatabase base=util.getDb().getWritableDatabase();            base.execsql(sql,new Object[]{_ID});            cursor=util.query_Cursor();            adapter=new SimpleCursorAdapter(MainActivity.this,R.ID.text_address});            ListvIEw.setAdapter(adapter);            return true;        }       });}

最后,介绍几个问题:

getWritableDatabase()与 getReadableDatabase() 区别:

两者均可对数据进行读写 *** 作,不能按照字面意思的理解.
他们的区别在于,当电脑的磁盘满的时候,使用getWritableDatabase() *** 作数据库时会报异常,
而getReadableDatabase()不会报异常,而是等待磁盘容量释放后,而后又调用getWritableDatabase()获取数据库 *** 作类对数据库进行 *** 作. 也就是说一个在错误的时候报异常,一个不会报异常,我们一般会用哪一个可想而知了,当然要用报异常的方法.

对于simpleCursorAdapter的使用:
首先,其数据适配器配置的游标 *** 作数据库的时候,不要关闭游标,或者关闭数据库,否则会报错.

其次,使用简单游标适配器的时候,查询出来的游标的数据字段中,必须包含一个字段_ID,否则会报错.

如何提高数据库 *** 作的效率?

1 当数据量不是很大的时候,我们使用原生提供的增删改查的方法与执行拼接的SQL语句没有多大的区别.只是当数据量增大的时候,建议使用拼接的SQL语句.

2 对数据库的 *** 作,从本质上是对文件的 *** 作,而每一次读取文件,都将变成一个耗时的 *** 作,因此对于很多数据的 *** 作,我们的做法是使用事务来进行,一次性的 *** 作,提高效率.

总结

以上是内存溢出为你收集整理的sqlite使用与simpleCursorAdapter展现全部内容,希望文章能够帮你解决sqlite使用与simpleCursorAdapter展现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1170698.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存