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

[经验分享] Android 数据存储和IO——SQLite(二)

[复制链接]

尚未签到

发表于 2016-11-30 09:54:07 | 显示全部楼层 |阅读模式
  接着上篇博文,这一篇主要说的SQLite。
  二:SQLite数据库
1. Android的SQLite数据库只是一个文件,我们可以把它看做是一个更为便捷的文件操作。Android提供了SQLiteDatabase代表一个数据库,一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来就可通过SQLiteDatabase对象来管理、操作数据库了。

  SQLiteDatabase提供的静态的方法来打开一个文件对应的数据库:
a. static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags):打开path文件所代表的SQLite数据库。
b. static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactory factory):打开或创建(如果不存在)file文件所代表的SQLite数据库。
c. static SQLiteDatabase openOrCreateDababase(String path,SQLiteDabase.CursorFactory factory):打开或创建(如果不存在)path文件所代表的SQLiteDatabase数据库。

  在获取到SQLiteDatabase对象后,接下来就可调用SQLiteDatabase的如下方法来操作数据库了。
a. execSQL(String sql,Object[] bindArgs):执行带占位符的SQL语句。
b. execSQL(String sql):执行SQL语句。
c. insert(String table,String nullColumnHack,ContentValues values):向执行表中插入数据。
d. update(String table,ContentValues,values,String whereClaues,String[] whereArgs):更新指定表中的特定数据。
e. delete(String table,String whereClaues,String[] whereArgs):删除指定表中的特定的数据。
f. Cursor query(String table,String[] columns,String selection,String [] selectionArgs,String groupBy,String having,String orderBy):对执行数据表执行查询。
g. Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit):对执行数据表执行查询。limit参数控制最多查询几条记录(控制分页的参数)
h. Cursor query(boolean distinct,String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit):对指定表执行
  查询语句。其中第一个参数控制是否去除重复值。
i. rawQuery(String sql,String[] seletionArgs):执行带占位符的SQL查询。
j. beginTransaction():开始事务。
k. endTransaction():结束事务。

  上面的查询方法都返回一个Cursor对象。Cursor提供了如下的方法来移动查询结果的记录指针。
a. move(int offset):将记录指针向上或向下移动指定的行数。offset为正数就是向下移动;为负数就是向上移动。
b. boolean moveToFirst():将记录指针移动到第一行,如果移动成功则返回true.
c. boolean moveToLast():将记录指针移动到最后一行,如果移动成功则返回true.
d. boolean movwToNext():将记录指针移动到下一行,如果移动成功则返回true.
e. boolean movePosition(int position):将记录指针移动到指定的行,如果移动成功则返回true.
f. boolean moveToPrevious():将记录指针移动到上一行,如果移动成功则返回true,

  一旦将记录指针移动到指定的行后,接下来就可以调用Cursor的getXxx()方法来获取该行的指定列的数据。
SQLiteDatabase的execSQL方法可执行任意的SQL语句,包括带占位符的SQL语句。但由于该方法没有返回值,一般用于执行DDL语句或DML语句;如果需要执行查询语句,则可调用SQLiteDatabase的rawQuery(String sql,String[] selectionArgs)方法。

  一般可以将查询的结果Cursor封装成SimpleCursorAdapter,这个SimpleCursorAdapter实现了Adapter接口,因此可以作为ListView或GridView的内容适配器。
SimpeCursoeAdapter的构造器参数与SimpleAdapter的构造器参数大致相同,区别是SimpleAdapter负责封装集合元素为Map的List,而SimpleCursorAdapter负责封装Cursor:如果我们把Cursor里的结果集当成List集合,Cursor里的每一行当成Map处理(以数据列的列名为key,数据列的值为value),那么SimpleCursorAdapter与SimpleAdapter就统一起来了。
另外一点是:使用SimpleCursorAdapter封装了Cursor时要求底层数据表的主键列的列名为_id,因为SimpleCursorAdapter只能识别列名为_id的主键。因此创建数据库表时要指定主键的列名为_id.
  总结起来使用SQLiteDatabase进行数据库操作的步骤如下:
a. 获取SQLiteDatabase对象,它代表了与数据库的连接。
b. 调用SQLiteDatabase的方法来执行SQL语句。
c. 操作SQL语句的执行结果,比如用SimpleCursorAdapter封装Cursor。
d. 关闭SQLiteDatabase,回收资源。
  2. 使用特定的方法操作SQLite数据库
Android提供了insert,update,delete,query语句来操作数据库。
a. 使用insert方法插入记录:
SQLiteDatabase的insert方法的签名为long insert(String table,String nullColumnHack,ContentValues values),参数说明:
table:代表想插入数据的表名。
nullColumnHack:代表强行插入null值的数据列的列名。
values:代表一行记录的数据。
insert方法插入的一行记录使用ContentValues存放,ContentVlaues类似于Map,它提供了put(String key,Xxx value)方法用于存入数据、getAsXxx(String key)方法用于取出数据。
不管第三个参数是否包含数据,执行insert()方法总会添加一条记录。
b. 使用update方法更新记录
c. 使用delete方法删除数据
d. 使用query()方法查询记录
  三、SQLiteOpenHelper类
SQliteOpenHelper是Android提供的一个管理数据库的工具类,可用于管理数据库的创建和版本的更新。一般的用法是创建SQLiteOpenHelper的子类,并扩展它的onCreate(SQLiteDatabse db)和onUpgrade(SQLiteDatabse db,int oldVerson,int newVerson)方法。

  SQLiteOpenHelper包含的常用的方法:
a. synchronized SQLiteDatabase getReadableDatabse():以读写的方式打开数据库对应的SQLiteDatabase对象。
b. synchronized SQLiteDatabase gerWritableDatabase():以写的方式打开数据库对应的SQLiteDatabase对象。
c. abstract void onCreate(SQLiteDatabase db):当第一次创建数据库时回调该方法
d. abstract void onUpgrade (SQLiteDatabase db,int oldVersion,int newVersion):当数据库版本更新时回调该方法。
e. synchronized void close():关闭所有打开的SQLiteDatabase
因为SQLiteOpenHelper提供了getReadableDatabase()、getWriteDatabase()两个方法用于打开数据库连接,并提供了close方法 来关闭数据库连接,我们只要重写它的恋歌抽象方法就可以:onCreate()和onUpgrade()
  接下来,用一个实例来实现用SQLite来存储数据:生词本

运维网声明 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-307540-1-1.html 上篇帖子: 推荐个好东西——嵌入式数据库sqlite 下篇帖子: sqlite的使用方法和函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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