设为首页 收藏本站
查看: 1305|回复: 0

[经验分享] android笔记--android数据存储--SQLite数据库

[复制链接]

尚未签到

发表于 2016-12-1 09:42:47 | 显示全部楼层 |阅读模式
  
[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
 
获取SQLiteDatabase实例: 可以通过SQLiteDatabase类的静态方法获取其实例对象, 更一般的做法是通过SQLiteOpenHelper类创建SQLiteDatabase对象.
创建一个SQLiteOpenHelper子类, 并重写其onCreate()和onUpgrade()方法.
public class DbOpenHelper extends SQLiteOpenHelper {
public DbOpenHelper(Context context) {
// xing.db表示数据库的名称
// null表示使用系统默认的游标工厂对象
// 最后一个参数表示数据库的版本号, 版本号不能为0, 否则会导致onCreate方法不被执行
// 可查询源代码得知.
// 数据库文件存储在data/data/<package name>/databases目录下
super(context, "xing.db", null, 1);
}
/**
 * 数据库被创建时自动调用, 该方法一般完成建表操作
 */
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE person(_id integer primary key autoincrement, name varchar(20), phone varchar(11), amount integer)");
}
/**
 * 数据库版本号改变时自动调用该方法 . 如果软件升级时涉及数据库表结构的改变, 可以在此方法中完成相关编码.
 */
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
调用SQLiteOpenHelper子类对象的getReadableDatabase()方法或getWriteableDatabase()方法可以获得SQLiteDatabase实例, 如果此时数据库不存在, android系统会自动生成一个数据库, 接着调用onCreate(SQLiteDatabase db)方法, 并将生成的数据库对象作为参数传递给该方法, 一般来说需要在onCreate方法中进行创建表的操作. 当数据库的版本更新时, 将回调onUpgrade()方法.
getWriteableDatabase()方法以读写方式打开数据库, 一旦数据库的磁盘空间满了, 数据库只能读而不能写, 这时程序就会出错. 而getReadableDatabase()方法会先尝试以读写的方式打开数据库, 一旦发生磁盘已满数据库只能读不能写的情况, 就会转而以只读的方式打开数据库, 程序也就不会出错.
 
数据库的增删改查. 获得SQLiteDatabase实例后, 就可调用其相应的方法以操作数据:
|--void execSQL (String sql): 执行SQL语句.
|--void execSQL (String sql, Object[] bindArgs): 执行带占位符的SQL语句.
|--Cursor rawQuery (String sql, String[] selectionArgs): 执行带占位符的查询语句并返回Cursor对象.
SQLiteDatabase类还包含一些具体的增删改查方法, 以方便对SQL语句不熟悉的开发者. 如果你熟悉常用的SQL语句, 推荐使用上述3个方法操作数据库.
 
Cursor对象. SQLite数据库查询语句的返回结果都是一个Cursor对象, Cursor对象的记录指针刚开始指向列名行.
|--boolean move (int offset): 将记录指针向上或向下移动指定的行数.
|--boolean moveToFirst (): 将记录指针移动到第一行.
|--boolean moveToLast (): 将记录指针移动到最后一行.
|--boolean moveToNext (): 将记录指针移动到下一行.
|--boolean moveToPosition (int position): 将记录指针移动到指定行.
|--boolean moveToPrevious (): 将记录指针向上移动一行.
一旦将记录指针移动到指定行后, 就可以调用Cursor对象的getXxx(int columnIndex)方法获取该行指定列的数据, 调用Cursor对象的getColumnIndex(String columnName)方法可以通过列名获得列的索引columnIndex.
Cursor对象在使用后, 应调用其close()方法关闭它. 但有一种情况例外: Cursor对象应用在adapter中时, 这种情况下如果关闭了Cursor, 会导致listview无法显示数据. 此时我们可以在Activity的onDestroy()方法中关闭它.
 
事务的提交与回滚. 某些数据的操作需要一起成功, 如果不能都成功, 则需要都失败, 不能出现部分操作成功的情况.
SQLiteDatabase类的几个方法提供这种事务功能:
|--void beginTransaction (): 开始事务.
|--void endTransaction (): 结束事务. 为确保该方法一定被调用, 一般可将其放置在finally语句块中.
|--void setTransactionSuccessful (): 设置事务标记为true. 事务标记的默认值为false, 调用endTransaction()方法结束事务时如果事务标记为false则回滚事务(即操作不进行), 如果事务标记为true则提交事务(即执行操作). 因此一般在调用beginTransaction()方法开启事务之后就紧接着调用setTransactionSuccessful ()方法.
|--boolean inTransaction (): 判断当前上下文是否处于事务中.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-308042-1-1.html 上篇帖子: (转)SQLite入门与分析(四)---Page Cache之事务处理(1) 下篇帖子: android-day2- save read file, xml , sqlite basic function
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表