Android学习笔记034之数据存储-SQLite数据库_第1页
Android学习笔记034之数据存储-SQLite数据库_第2页
Android学习笔记034之数据存储-SQLite数据库_第3页
Android学习笔记034之数据存储-SQLite数据库_第4页
Android学习笔记034之数据存储-SQLite数据库_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android学习笔记034之数据存储—SQLite数据库前面我们介绍了Android数据存储的两种方法:文件存储和SharedPreference存储,这一篇我们来学习一下Android存储数据的另外一种方式——SQLite数据库存储。1、SQlite数据库简介现在的主流移动智能设备中,比如Android手机、iPhone手机,平板等都是使用SQLite数据库作为存储复杂数据的存储引擎。那么什么是SQLite数据库呢?SQLite是D.RichardHipp用C语言编写的开源嵌入式数据库引擎,它支持大多数的SQL92SQLiteSQLite(VDBE)修改和扩展SQLiteSQLSQLite虚拟机中执行的程序集。SQlite数据库是一个轻量级的关系型数据库,不需要像其它关系型数据库一样需要安装,Android已经将SQLite数据库内置在系统中,内置的版本是3.0SQlite支持标准的SQL语法,还支持ACID()用。袖珍型的SQLite2TB件的形式存在,这些数据都是以B-Tree的数据结构形式存储在磁盘上。每一个数据库是一个文件,数据库中可以包含多个表,表中可以包含多个字段。SQLite数据库支持INTEGERREALTEXT和BLOB数据类型,分别代表空SQLite采用动态数据类型,当某个值插入到数据库时,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,SQLite称这为“INTEGERPRIMARYmissmatch”的错误。简单的说就是:我们可以各种数据类型的数据保存到任何字段中而不用关心字段声明的数据类型。下面是Android系统中SQLite数据库的几个关键类:SQLiteOpenHelper:数据库抽象类,我们通过继承该类,获取数据库实例,然后可以重写数据库创建、更新版本方法和关闭数据库CRUDCursor:游标:类似于JDBC里的结果集2、SQLiteOpenHelper创建数据库与版本管理我们继承SQLiteOpenHelper本发生变更的时候调用。还有必须要实现一个构造方法,下面是代码示例:publicclassDBOpenHelperextendsSQLiteOpenHelper{privatestaticStringDB_NAME="db_test.db";privatestaticintDB_VERSION=1;publicDBOpenHelper(Contextcontext){super(context,DB_NAME,null,}/**数据库第一次创建的时候调用*@paramsqLiteDatabase*/@OverridepublicvoidonCreate(SQLiteDatabasesqLiteDatabase){}/**数据库版本发生改变的时候调用*@paramsqLiteDatabase@parami@parami1*/@OverridepublicvoidonUpgrade(SQLiteDatabasesqLiteDatabase,inti,inti1){}}上述代码启动会创建一个db_test.db的数据库文件,在data/data/包名/database目录下就可以看到创建的数据库文件,将其导出之后就可以用图形化工具查看。3、SQLite数据库图形化工具SQLiteSQLiteAndroidDeviceMonitor这个可视化工具实用不是很复杂,就不在做很多的介绍了。4、SQLite数据库使用下面我们进行数据库的基本使用,在Android开发中,我们不需要写很多SQL语句,AndroidAndroidCRUD介绍:数据增加:insert(Stringtable,StringnullColumnHack,ContentValuesvalues)参数解析:第一个是数据表名;第二个是设置为nullContentValues封装。数据删除:delete(Stringtable,StringwhereClause,String[]whereArgs)参数解析:第一个是数据表名;第二个是where条件;第三个是约束数据更新:update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)where数据查询:query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit)query(booleandistinct,Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit,CancellationSignalcancellationSignal)query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)query(booleandistinct,Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit)参数解析:table:表名称columsselection:表示WHERE之后的条件语句,可以使用占位符selectionArgs:条件语句的参数数组groupBy:指定分组的列名having配合groupByorderBy:y指定排序的列名limit:指定分页参数distinct:指定“true”或“false”表示要不要过滤重复值Cursor:返回值,相当于结果集ResultSet下面通过实现数据库的基本CRUD操作体会一下:Activity代码:packagecom.example.datasave;importandroid.content.ContentValues;importandroid.database.Cursor;importandroid.database.sqlite.SQLiteDatabase;importandroid.os.Bundle;importandroid.support.annotation.Nullable;importandroid.support.v7.app.AppCompatActivity;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;importjava.util.ArrayList;importjava.util.List;/**CreatedbyDevinon2016/7/20.*/publicclassSQLiteActivityextendsAppCompatActivity{privateButtonbtn_sqlite_insert;privateButtonbtn_sqlite_delete;privateButtonbtn_sqlite_update;privateButtonbtn_sqlite_select;privateSQLiteDatabasemDatabase;privateDBOpenHelpermDBOpenHelper;privatestaticfinalStringTAG="SQLiteActivity";@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite);mDBOpenHelper=newDBOpenHelper(this);mDatabase=mDBOpenHelper.getWritableDatabase();btn_sqlite_insert=(Button)findViewById(R.id.btn_sqlite_insert);btn_sqlite_insert.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){insert();}});btn_sqlite_delete=(Button)findViewById(R.id.btn_sqlite_delete);btn_sqlite_delete.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){delete(5);}});btn_sqlite_update=(Button)findViewById(R.id.btn_sqlite_update);btn_sqlite_update.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){update(6);}});btn_sqlite_select=(Button)findViewById(R.id.btn_sqlite_select);btn_sqlite_select.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){select();}});}privatevoidselect(){Cursorcursor=mDatabase.query("student",null,null,null,null,null,null);List<StudentModel>students=newArrayList<>();while(cursor.moveToNext()){StudentModelmodel=newStudentModel();model.setS_id(cursor.getInt(cursor.getColumnIndex("s_id")));model.setName(cursor.getString(cursor.getColumnIndex("name")));model.setSex(cursor.getString(cursor.getColumnIndex("sex")));model.setGrade(cursor.getString(cursor.getColumnIndex("grade")));students.add(model);数据 >>"+model.toString());}cursor.close();ToastUtils.showToast(this,students.toString());}privatevoidupdate(ints_id){ContentValuesvalues=newContentValues();values.put("ade","2013级信计班");mDatabase.update("student",values,"s_id=?",newString[]{""+s_id+""});ToastUtils.showToast(this,"更新了s_id为"+s_id+"的数据");}privatevoidinsert(){ContentValuesvalues=newContentValues();values.put("name","李四");values.put("sex","男");values.put("grade","2012级数应班");mDatabase.insert("student",null,values);ToastUtils.showToast(this,"插入数据成功");}privatevoiddelete(intposition){mDatabase.delete("student","s_id=?",newString[]{""+position+""});ToastUtils.showToast(this,"删除了s_id为"+position+"的数据");}}SQLiteOpenHelper代码:packagecom.example.datasave;importandroid.content.Context;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;/**CreatedbyDevinon2016/7/20.*/publicclassDBOpenHelperextendsSQLiteOpenHelper{privatestaticStringDB_NAME="db_test.db";privatestaticintDB_VERSION=1;privatestaticfinalStringTEST_TABLE="CREATETABLEstudent(s_idINTEGERPRIMARYKEYAUTOINCREMENT,"+"nameVARCHAR(20),sexVARCHAR(10),gradeVARCHAR(100))";publicDBOpenHelper(Contextcontext){super(context,DB_NAME,null,}/**数据库第一次创建的时候调用*@paramsqLiteDatabase*/@OverridepublicvoidonCreate(SQLiteDatabasesqLiteDatabase){sqLiteDatabase.execSQL(TEST_TABLE);}/**数据库版本发生改变的时候调用*@paramsqLiteDatabase@parami@parami1*/@OverridepublicvoidonUpgrade(SQLiteDatabasesqLiteDatabase,inti,inti1){}}布局文件非常简单,就不再贴代码了,下面是实现效果图:由于是录制GIF,速度比较慢,这样就可以基本实现数据库的CRUD操作。5、SQLite数据库事务上面我们介绍了SQLiteSQLite来了解一下什么是事务?什么是事务?原子性、一致性、隔离性和持久性)10001000块,李四的账户上要增加1000块,只有两个操作都完成,事务才会提交。假如张三的账户减少了1000100010001000块,这显然都是不可以的。比如下面的例子代码:/**事务测试*/publicvoidpayment(){SQLiteDatabasedb=mDBOpenHelper.getWritableDatabase();//开启事务db.beginTransaction();try{db.execSQL("update person set amount=amount-10 where personid=?", Object[]{1});db.execSQL("update person set amount=amount+10 where personid=?", Object[]{2});//设置事务标志为成功,当结束事务时就会提交事务db.setTransactionSuccessful();}catch(Eptione){e.printStackTrace();}finally{//结束事务db.endTransaction();}}data/data/<>/database/xxx.db-journal让数据库支持事务的临时日志文件。6、SQLite数据库二进制大文件保存和读取的例子:SQLiteDatabasedb=mDBService.getWritableDatabase();//得到数据库try{ByteArrayOutputStreambaos=newByteArrayOutputStream();((BitmapDrawable)iv.getDrawable()).getBitmap().compress(,100,baos);//压缩为PNG格式,100Object[]args=newObject[]{baos.toByteArray()};db.execSQL(INSERT_SQL,args);baos.close();db.close();}catch(Exceptione){e.printStackTrace();}}//3.从数据库中取图片publicvoidgetPhoto(){StringSELECT_SQL="SELECTphotoFROMlauncher";ImageViewappIcon=(ImageView)v.findViewById(R.id.appicon);//v是我在类中定义的一个view对象,跟前面保存图片一样byte[]photo=null;mDBService=newDBService(getContext());SQLiteDatabasedb=mDBService.getReadableDatabase();CursormCursor=db.rawQuery(SELECT_SQL,null);if(mCursor!=null){if(mCursor.moveToFirst()){//justneedtoqueryonetimephoto

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论