第8讲9 08数据存储与访问_第1页
第8讲9 08数据存储与访问_第2页
第8讲9 08数据存储与访问_第3页
第8讲9 08数据存储与访问_第4页
第8讲9 08数据存储与访问_第5页
已阅读5页,还剩79页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

Android数据存储数据存储应用程序的基本功能数据需要以某种方式保存而不会丢失数据能够有效方便的被使用Android数据存储4种数据存储方式SharedPreferencesFilesSQLiteContentProviders1Android数据存储(2)SharedPreferences用来存储键-值对形式的数据轻量级的键值存储方式,用来存储基本数据Files通过文件来进行数据的存储文件是私有的SQLite支持SQL的关系数据库ContentProviders实现程序之间对数据的共享通过提供公共URI(对象)2第8章数据存储与访问8.1SharedPreferences8.2SQLite数据库8.1SharedPreferencesSharedPreferences是一种轻量级数据存储方式,能够实现不同应用程序间数据共享。(有点类似Web中的Cookie)

保存在Android文件系统中屏蔽了文件系统的操作过程SharedPreferences使用键值对(Name/Value)的方式把简单数据类型(boolean、int、float、long和String)存储在应用程序的私有目录下自己定义的xml文件中。私有目录是:/data/data/应用程序包名/shared_prefs/SharedPreferences(2)SharedPreferences支持的数据类型布尔类型字符串类型长整型整型可存储的数据对象默认值类实例变量当前UI状态用户首选项SharedPreferences可跨越用户会话持久保存数据并可以在应用程序之间进行共享设置5SharedPreferences支持三种访问模式MODE_PRIVATE(私有):仅创建SharedPreferences的程序有权限对其进行读取或写入MODE_WORLD_READABLE(全局读):不仅创建程序可以对其进行读取或写入,其它应用程序也具有读取操作的权限,但没有写入操作的权限MODE_WORLD_WRITEABLE(全局写):所有程序都可以对其进行写入操作,但没有读取操作的权限SharedPreferences编程主要步骤(1)先创建SharedPreferences对象,例如:

SharedPreferencessp=getSharedPreferences(名称,访问模式);(2)写入数据:

SharedPreferences.Editoreditor=sp.edit();editor.putString("Name","Tom");//put方法写数据

mit();//一定要提交才能保存(3)读取数据:

SharedPreferencessp=getSharedPreferences(名称,访问模式);Stringname=sp.getString("Name","DefaultVal");//对应的get方法读数据第2个参数:在无法获取值的时候使用的缺省值SharedPreferences数据保存的文件名SharedPreferences示例第一次运行输入3个值保存后退出,下一次再启动程序时自动将保存的值读取出来显示MainActivity主要代码(保存数据)protectedvoidonCreate(BundlesavedInstanceState){…finalEditTextet1=(EditText)findViewById(R.id.editText1);finalEditTextet2=(EditText)findViewById(R.id.editText2);finalEditTextet3=(EditText)findViewById(R.id.editText3);Buttonbt1=(Button)findViewById(R.id.button1);bt1.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewarg0){SharedPreferencessp=getSharedPreferences("MyInfo",Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);SharedPreferences.Editoreditor=sp.edit();editor.putString("username",et1.getText().toString());editor.putString("password",et2.getText().toString());editor.putInt("age",Integer.parseInt(et3.getText().toString()));mit();}});}数据保存的文件名为MyInfo.xml读和写操作2种权限提交保存putInt()时注意转换数据Put方法存储数据ThisconstantwasdeprecatedinAPIlevel17.Creatingworld-readablefilesisverydangerous,andlikelytocausesecurityholesinapplications.Itisstronglydiscouraged;instead,applicationsshouldusemoreformalmechanismforinteractionssuchasContentProvider,BroadcastReceiver,andService.Therearenoguaranteesthatthisaccessmodewillremainonafile,suchaswhenitgoesthroughabackupandrestore.Filecreationmode:allowallotherapplicationstohavereadaccesstothecreatedfile.MainActivity主要代码(读取数据)@OverrideprotectedvoidonStart(){EditTextet1=(EditText)findViewById(R.id.editText1);EditTextet2=(EditText)findViewById(R.id.editText2);EditTextet3=(EditText)findViewById(R.id.editText3);

SharedPreferencessp=getSharedPreferences("MyInfo",

Context.MODE_WORLD_READABLE);et1.setText(sp.getString("username","noname"));et2.setText(sp.getString("password","000000"));et3.setText(String.valueOf(sp.getInt("age",0)));super.onStart();}从MyInfo.xml文件中读取数据getInt()后注意转换为字符串用对应的get方法读取数据第2个参数:在无法获取值的时候使用的缺省值查看设备上的SharedPreferences数据(本例在MyInfo.xml中)/data/data/包名/shared_prefs/MyInfo.xml文件打开DDMS补充:Linux系统中的文件权限Linux系统中的文件权限描述创建者、同组用户和其他用户对文件的操作限制x表示可执行,r表示可读,w表示可写,d表示目录,-表示普通文件“-rw-rw-rw”表示文件可以被创建者、同组用户和其他用户进行读取和写入操作,但不可执行产生的文件权限与程序人员设定的SharedPreferences的访问模式有关“-rw-rw-rw”的权限是“全局读+全局写”的结果SharedPreferences的访问模式设置为私有文件权限将成为“-rw-rw---”表示仅有创建者和同组用户具有读写文件的权限13MyInfo.xml文件内容<?xmlversion='1.0'encoding='utf-8'standalone='yes'?><map><stringname="password">123456</string><stringname="username">wustzz</string><intname="age"value="39"/></map>editor.putString("username",et1.getText().toString());editor.putString("password",et2.getText().toString());editor.putInt("age",Integer.parseInt(et3.getText().toString()));【返回】8.2SQLite数据库SQLite是在2000年由D.RichardHipp发布,可以支援Java、Net、PHP、Ruby、Python、Perl、C等几乎所有的现代编程语言,支持Windows、Linux、Unix、MacOS、Android、IOS等几乎所有的主流操作系统平台。D.RichardHippAndroid在运行时(run-time)集成了SQLite,所以每个Android应用程序都可以使用SQLite数据库。SQLite特点SQLite是一款开源的、轻量级的、嵌入式的、关系型数据库。普通数据库的管理系统比较庞大和复杂,会占用了较多的系统资源,轻量级数据库SQLite的特点:比传统数据库更适合用于嵌入式系统占用资源少,运行高效可靠,可移植性强提供了零配置(zero-configuration)运行模式数据库存储在:/data/data/应用程序包名/databases/SQLite编程示例假设数据库名称:test.dbperson表结构:列名类型说明idINTEGER(自增)主键name

VARCHARageSMALLINT准备工作先建一个Person类:publicclassPerson{publicintid;publicStringname;publicintage;publicPerson(){}publicPerson(Stringname,intage){=name;this.age=age;;}}SQLite基本编程--创建数据库和表//打开或创建test.db数据库SQLiteDatabasedb=openOrCreateDatabase("test.db",

Context.MODE_PRIVATE,null);

db.execSQL("DROPTABLEIFEXISTSperson");

//创建person表db.execSQL("CREATETABLEperson(idINTEGERPRIMARYKEY

AUTOINCREMENT,nameVARCHAR,ageSMALLINT)");execSQL()方法执行标准的SQL语句主键自增不能将数据库设为WORLD_READABLE每个数据库都只能被创建它的包访问,数据库名CursorFactory一般设置为空查看SQLite数据库文件(本例为test.db)/data/data/包名/databases/test.db文件打开DDMSSQLite基本编程--添加数据Personperson=newPerson();="wust";person.age=20;//插入数据db.execSQL("INSERTINTOpersonVALUES(NULL,?,?)",newObject[]{,person.age});

?为占位符由于id字段是主键且自增,在添加记录时系统会自动生成id值,因此不需要再在程序中添加。注意填充占位符的数据定义方法SQLite基本编程--添加数据2Personperson2=newPerson("Tom",20);//ContentValues以键值对的形式存放数据ContentValuescv=newContentValues();cv.put("name",);cv.put("age",person2.age);//插入ContentValues中的数据db.insert("person",null,cv);//第二个参数一般设置为nullSQLite基本编程--更新数据cv=newContentValues();cv.put("age",35);//用ContentValues中的数据更新记录db.update("person",cv,"name=?",newString[]{"Tom"});//或者//db.execSQL("Updatepersonsetage=?wherename=?",newObject[]{35,"Tom"});条件语句条件值SQLite基本编程--删除数据//删除数据db.delete("person","age<?",newString[]{"38"});//或者//db.execSQL("Deletefrompersonwhereage<?",newObject[]{"38"});SQLite为弱类型,会自动将String转换为intSQLite基本编程--查询数据TextViewtv=(TextView)findViewById(R.id.textView1);//简单用TextView显示数据Cursorc=db.rawQuery("SELECT*FROMpersonwhereage>?",newString[]{"10"});while(c.moveToNext()){intid=c.getInt(c.getColumnIndex("id"));

Stringname=c.getString(c.getColumnIndex("name"));intage=c.getInt(c.getColumnIndex("age"));tv.setText(tv.getText()+"\n"+"id="+id+",name="+name+",age="+age);}c.close();rawQuery()原生查询,返回值是Cursor游标(结果集)根据列号来取值处理完毕后记得关闭游标Cursor游标的一些重要操作c.move(intoffset);//以当前位置为参考,移动到指定行c.moveToFirst(); //移动到第一行c.moveToLast(); //移动到最后一行c.moveToPosition(intposition);//移动到指定行c.moveToPrevious();//移动到前一行c.moveToNext(); //移动到下一行c.isFirst();//是否指向第一条c.isLast();//是否指向最后一条c.isNull(intcolumnIndex); //指定列是否为空(列基数为0)c.isClosed(); //游标是否已关闭c.getCount(); //总数据项数c.getPosition(); //返回当前游标所指向的行数c.getColumnIndex(StringcolumnName);//返回某列名对应的列索引值c.getString(intcolumnIndex);//返回当前行指定列的值SQLite基本编程--示例SQLiteDemo实例:建立数据库(20)SQLiteDemo数据库操作28关于SQLiteOpenHelper辅助类Android提供了一个名为SQLiteOpenHelper的辅助类帮助开发人员创建一个数据库。SQLiteOpenHelper是一个包装了数据库的创建、打开和更新的抽象类。创建过程:当前项目src某包上->右键->New->class

->输入class名(例如DBConnection),并继承SQLiteOpenHelper类即可。SQLiteOpenHelper子类主要代码publicclassDBConnectionextendsSQLiteOpenHelper{

DBConnection(Contextcontext,Stringname,CursorFactoryfactory,intversion){

super(context,name,factory,version);

}@OverridepublicvoidonCreate(SQLiteDatabasedb){

//数据库第一次被创建时onCreate被调用//通常将创建表的操作放在这里

}@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){

//当数据库版本发生变化时会调用onUpgrade//这里可写更新数据表的操作,也可空着不写

}}构造函数的四个参数:上下文环境(例如一个Activity)数据库名字游标工厂(通常是Null)数据库版本号开发人员为了方便数据库操作可以进一步扩展SQLiteOpenHelper类DBConnection扩展示例publicclassDBConnectionextendsSQLiteOpenHelper{privatestaticfinalStringDATABASE_NAME="test.db";privatestaticfinalintDATABASE_VERSION=1;

privatestaticContextcontext;

publicDBConnection(){super(context,DATABASE_NAME,null,DATABASE_VERSION);}@OverridepublicvoidonCreate(SQLiteDatabasedb){db.execSQL("CREATETABLEIFNOTEXISTSperson"+"(idINTEGERPRIMARYKEYAUTOINCREMENT,nameVARCHAR,ageINTEGER)");}新建一个构造函数数据库名数据库版本号数据库第一次被创建时onCreate被调用,这里用来创建数据表DBConnection扩展示例@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){}publicstaticvoidsetContext(Contextcontext){DBConnection.context=context;}publicSQLiteDatabasegetConnection(){SQLiteDatabasedb=getWritableDatabase();returndb;}publicvoidclose(SQLiteDatabasedb){db.close();}}新添加3个方法getWritableDatabase():打开一个可以读写的数据库getReadableDatabase():打开一个只读的数据库设置上下文连接数据库(打开数据库)关闭数据库实例:建立数据库直接创建数据库首先调用openOrCreateDatabases()函数创建数据库对象然后执行SQL命令建立数据库中的表和直接的关系不使用SQLiteOpenHelper类33privatestaticfinalStringDB_CREATE="createtable"+ DB_TABLE+"("+KEY_ID+"integerprimarykeyautoincrement,"+ KEY_NAME+"textnotnull,"+KEY_AGE+"integer,"+KEY_HEIGHT+"float);";publicvoidcreate(){ db.openOrCreateDatabases(DB_NAME,context.MODE_PRIVATE,null) db.execSQL(DB_CREATE);}使用SQLiteOpenHelper子类DBConnectionDBConnection.setContext(getApplicationContext());

//必须先设置上下文或用MainActivity.this//创建DBConnection对象(含创建数据库+数据表)DBConnectionconn=newDBConnection();//打开数据库SQLiteDatabasedb=conn.getConnection();//后面的操作同前TextViewtv=(TextView)findViewById(R.id.textView1);Cursorc=db.rawQuery("SELECT*FROMpersonwhereage>?",newString[]{"10"});while(c.moveToNext()){intid=c.getInt(c.getColumnIndex("id"));Stringname=c.getString(c.getColumnIndex("name"));intage=c.getInt(c.getColumnIndex("age"));tv.setText(tv.getText()+"\n"+"id="+id+",name="+name+",age="+age);}c.close();//关闭Cursorconn.close(db);//关闭当前数据库SQLite数据库编程实例例子:

【完】动态建立和使用SQLite数据库动态建立SQLite数据库在程序中使用代码动态建立数据库数据库的建立创建和打开数据库使用openOrCreateDatabase方法openOrCreateDatabase方自动检测数据库的存在如果存在打开数据库如果数据库并不存在,自动建立数据库后打开创建成功,返回SQLiteDatabase对象创建不成功,抛出FileNotFoundException数据库操作的封装编程实现时一般将所有对数据库的操作都封装在一个类中调用这个类来完成对数据库的操作添加,更新,删除,查询等36实例:建立数据库DBAdapter类封装数据库的建立、打开和关闭等操作37publicclassDBAdapter{ privatestaticfinalStringDB_NAME="people.db"; privatestaticfinalStringDB_TABLE="peopleinfo"; privatestaticfinalintDB_VERSION=1;

publicstaticfinalStringKEY_ID="_id"; publicstaticfinalStringKEY_NAME="name"; publicstaticfinalStringKEY_AGE="age"; publicstaticfinalStringKEY_HEIGHT="height";

privateSQLiteDatabasedb; privatefinalContextcontext; privateDBOpenHelperdbOpenHelper;实现内部静态类DBOpenHelper,继承帮助类SQLiteOpenHelper辅助建立、更新和打开数据库DBAdapter类中首先声明数据库的基本信息声明SQLiteDatabase对象db,建立删除数据库、执行SQL命令对数据进行管理实例:建立数据库(2)3814. privatestaticclassDBOpenHelperextendsSQLiteOpenHelper{ publicDBAdapter(Context_context){ context=_context; }

publicvoidopen()throwsSQLiteException{ dbOpenHelper=newDBOpenHelper(context,DB_NAME,null,DB_VERSION); try{ db=dbOpenHelper.getWritableDatabase(); }catch(SQLiteExceptionex){ db=dbOpenHelper.getReadableDatabase(); } }

open()函数中并没有任何对数据库进行实际操作的代码调用SQLiteOpenHelper类的getWritableDatabase()函数和getReadableDatabase()函数这个两个函数会根据数据库是否存在、版本号和是否可写等情况,决定在返回数据库对象前,是否需要建立数据库实例:建立数据库(3)39

publicvoidclose(){ if(db!=null){ db.close(); db=null; } }}close()函数中调用了SQLiteDatabase对象的close()方法关闭数据库唯一直接调用SQLiteDatabase对象的方法SQLiteDatabase中封装打开数据库的函数openDatabases()创建数据库函数openOrCreateDatabases()代码中使用帮助类SQLiteOpenHelper避免直接调用SQLiteDatabase中的打开和创建数据库的方法简化数据库打开过程中繁琐的逻辑判断过程实例:建立数据库(6)重载onCreate()函数和onUpgrade()函数40privatestaticclassDBOpenHelperextendsSQLiteOpenHelper{publicDBOpenHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){ super(context,name,factory,version); }privatestaticfinalStringDB_CREATE="createtable"+ DB_TABLE+"("+KEY_ID+"integerprimarykeyautoincrement,"+KEY_NAME+"textnotnull,"+KEY_AGE+"integer,"+KEY_HEIGHT+"float);";@OverridepublicvoidonCreate(SQLiteDatabase_db){ db.execSQL(DB_CREATE); }

onCreate()函数在数据库第一次建立时被调用实例:建立数据库(7)41@Override publicvoidonUpgrade(SQLiteDatabase_db,int_oldVersion,int_newVersion){ _db.execSQL("DROPTABLEIFEXISTS"+DB_TABLE); onCreate(_db); }}onUpgrade()函数在数据库需要升级时被调用一般用来删除旧的数据库表,并将数据转移到新版本的数据库表中实例:建立数据库(9)函数的调用onCreate()和onUpgrade()函数调用程序员不应直接调用由SQLiteOpenHelper类来决定何时调用这两个函数getWritableDatabase()函数和getReadableDatabase()函数可以直接调用属于SQLiteOpenHelper类getWritableDatabase()函数用来建立或打开可读写的数据库对象函数调用成功后数据库对象将被缓存任何需要使用数据库对象时,都可以调用这个方法获取到数据库对象不使用时必须调用close()函数关闭数据库如果保存数据库文件的磁盘空间已满,调用getWritableDatabase()函数则无法获得可读写的数据库对象,可==可以调用getReadableDatabase()函数,获得一个只读的数据库对象42实例:建立数据库(10)数据操作对数据的添加、删除、查找和更新的操作通过执行SQL命名完成数据操作推荐使用Android提供的专用类和方法更加简洁易用在DBAdapter类中增加下面的这些函数使DBAdapter类支持数据操作insert(Peoplepeople):添加一条数据queryAllData():获取全部数据queryOneData(longid):根据id获取一条数据deleteAllData():删除全部数据deleteOneData(longid):根据id删除一条数据updateOneData(longid,Peoplepeople):根据id更新一条数据43实例:建立数据库(11)ConvertToPeople(Cursorcursor)私有函数,将查询结果转换为用来存储数据自定义的People类对象People类的四个公共属性ID、Name、Age和Height,对应数据库中的四个属性值重载toString()函数主要是便于界面显示的需要44publicclassDBAdapter{ publiclonginsert(Peoplepeople){} publiclongdeleteAllData(){} publiclongdeleteOneData(longid){} publicPeople[]queryAllData(){} publicPeople[]queryOneData(longid){} publiclongupdateOneData(longid,Peoplepeople){}

privatePeople[]ConvertToPeople(Cursorcursor){}}实例:建立数据库(12)People类45

publicclassPeople{ publicintID=-1; publicStringName; publicintAge; publicfloatHeight;

@Override publicStringtoString(){ Stringresult=""; result+="ID:"+this.ID+","; result+="姓名:"+this.Name+","; result+="年龄:"+this.Age+","; result+="身高:"+this.Height+","; returnresult; }}实例:建立数据库(13)添加功能首先构造一个ContentValues对象然后调用ContentValues对象的put()方法将每个属性的值写入到ContentValues对象中最后使用SQLiteDatabase对象的insert()函数将ContentValues对象中的数据写入指定的数据库表中insert()函数的返回值新数据插入的位置,即ID值ContentValues类是一个数据承载容器主要用来向数据库表中添加一条数据46SQ实例:建立数据库(14)添加功能向ContentValues对象newValues中添加一个名称/值对put()函数的第1个参数是名称,第2个参数是值insert()函数的第1个参数是数据表的名称,第2个参数是在NULL时的替换数据,第3个参数是需要向数据库表中添加的数据47publiclonginsert(Peoplepeople){ ContentValuesnewValues=newContentValues();

newValues.put(KEY_NAME,people.Name); newValues.put(KEY_AGE,people.Age); newValues.put(KEY_HEIGHT,people.Height);

returndb.insert(DB_TABLE,null,newValues);}ContentValues类是一个数据承载容器实例:建立数据库(15)删除功能删除数据比较简单只需调用当前数据库对象的delete()函数,并指明表名称和删除条件即可delete()函数的第1个参数是数据库的表名称,第2个参数是删除条件第2行代码:删除条件为null,表示删除表中的所有数据第6行代码:指明需要删除数据的id值,deleteOneData()函数仅删除一条数据,delete()函数的返回值表示被删除的数据的数量48publiclongdeleteAllData(){ returndb.delete(DB_TABLE,null,null);}publiclongdeleteOneData(longid){ returndb.delete(DB_TABLE,KEY_ID+"="+id,null);}实例:建立数据库(16)更新功能需要使用ContentValues对象首先构造ContentValues对象然后调用put()函数将属性的值写入到ContentValues对象中最后使用SQLiteDatabase对象的update()函数,并指定数据的更新条件第7行代码:update()函数的第1个参数表示数据表的名称,第2个参数是更新条件。update()函数的返回值表示数据库表中被更新的数据数量49publiclongupdateOneData(longid,Peoplepeople){ ContentValuesupdateValues=newContentValues(); updateValues.put(KEY_NAME,people.Name); updateValues.put(KEY_AGE,people.Age); updateValues.put(KEY_HEIGHT,people.Height);

returndb.update(DB_TABLE,updateValues,KEY_ID+"="+id,null);}实例:建立数据库(17)50privatePeople[]ConvertToPeople(Cursorcursor){ intresultCounts=cursor.getCount(); if(resultCounts==0||!cursor.moveToFirst()){ returnnull; } People[]peoples=newPeople[resultCounts]; for(inti=0;i<resultCounts;i++){ peoples[i]=newPeople(); peoples[i].ID=cursor.getInt(0); peoples[i].Name=cursor.getString(cursor.getColumnIndex(KEY_NAME)); peoples[i].Age=cursor.getInt(cursor.getColumnIndex(KEY_AGE)); peoples[i].Height=cursor.getFloat(cursor.getColumnIndex(KEY_HEIGHT)); cursor.moveToNext(); } returnpeoples;}实例:建立数据库(18)数据查询调用SQLiteDatabase类的query()函数query()函数的语法如下query()函数的参数说明51Cursorandroid.database.sqlite.SQLiteDatabase.query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)位置类型+名称说明1Stringtable表名称2String[]columns返回的属性列名称3Stringselection查询条件4String[]selectionArgs如果在查询条件中使用的问号,则需要定义替换符的具体内容5StringgroupBy分组方式6Stringhaving定义组的过滤器7StringorderBy排序方式实例:建立数据库(19)根据id查询数据的代码根据id查询全部数据的代码52publicPeople[]getOneData(longid){ Cursorresults=db.query(DB_TABLE,newString[]{KEY_ID,KEY_NAME,KEY_AGE,KEY_HEIGHT},KEY_ID+"="+id,null,null,null,null); returnConvertToPeople(results);}publicPeople[]getAllData(){ Cursorresults=db.query(DB_TABLE,newString[]{KEY_ID,KEY_NAME,KEY_AGE,KEY_HEIGHT},null,null,null,null,null); returnConvertToPeople(results);}实例:建立数据库(20)SQLiteDemo数据库操作53实例:建立数据库(21)SQLiteDemo的功能界面上方可以输入数据信息通过“添加数据”按钮将数据写入数据库“全部显示”查询数据库中的所有数据,数据显示在界面下方“清除显示”清除界面下面显示的数据,不对数据库进行任何操作“全部删除”删除数据库中的所有数据界面中间以“ID+功能”命名的按钮根据ID删除数据根据ID进行数据查询根据ID更新数据ID值就取自EditText控件54补充实例:出版社管理系统出版社作者管理系统AUTHOR_TABLE中定义作者的相关信息,主键为idBOOK_TABLE中定义了书的相关信息,主键为id通过author_id与AUTHOR_TABLE建立关联两个表结构的定义:56实例:出版社管理系统(2)获取一个可读的SQLiteDatabase获取一个可写的SQLiteDatabase57SQLiteDatabasedb=SQLOpenHelper.getReadableDatabase()SQLiteDatabasedb=SQLOpenHelper.getWriteableDatabase()实例:出版社管理系统(3)触发器(Trigger)机制在试图对指定的数据表执行指定的修改语句时,特定的数据操作将被自动执行,实现关联操作58db.execSQL("CREATETRIGGERbook_deleteDELETEON"+Publisher.AUTHOR_TABLE+""+"BEGIN"+"DELETEFROM"+Publisher.BOOK_TABLE+"WHERE"+Publisher.BOOK.AUTHOR_ID+"=old._id;"+"END;");//在数据库升级时,应该在onUpdate方法中删除已经创建的触发器db.execSQL("DROPTRIGERIFEXISTSbook_delete");实例:出版社管理系统(4)索引(Index)对数据表中一列或多列的值进行排序的一种结构索引在不读取整个表的情况下可以更快地查找数据通常仅仅在经常被检索的列上创建索引更新一个含有索引的表的时间要比更新没有索引的表的时间长59//建立了一个针对AUTHOR_TABLE表的NAME列的降序索引db.execSQL("CREATEINDEXauthorname_indexON"+Publisher.AUTHOR_TABLE+"("+Publisher.AUTHOR.NAME+""+DESC+");");实例:出版社管理系统(5)视图(View)表示一个或多个表中的记录可以在数据库中生成虚拟表视图的创建过程中经常使用到连接操作通过该操作可以联合查询多个表60db.execSQL("CREATEVIEWIFNOTEXISTS"+Publisher.BOOK_AUTHOR_TABLE+"AS"+"SELECT"+Publisher.BOOK_TABLE+".*"+","+Publisher.AUTHOR.NAME+"FROM"+Publisher.BOOK_TABLE+"LEFTOUTERJOIN"+Publisher.AUTHOR_TABLE+"ON"+Publisher.AUTHOR_TABLE+"."+Publisher.AUTHOR._ID+"="+Publisher.BOOK_TABLE+"."+Publisher.BOOK.AUTHOR_ID);实例:出版社管理系统(6)视图的建立PublisherDatabaseHelper类的onCreate方法中建立了一个名为“book_author”的视图为了能在应用的其余程序中访问到该视图,将视图的名字以静态变量的形式定义在Publisher类中变量名是BOOK_AUTHOR_TABLE该视图将BOOK_TABLE表的全部列和AUTHOR_TABLE表的NAME列重新组成一个新的虚拟表Select操作语句位于“AS”之后“Publisher.BOOK_TABLE+".*"+","+Publisher.AUTHOR.NAME”表示生成的虚拟表的列包含BOOK表中的全部列和AUTHOR表中的NAME列AUTHOR表的NAME列前面不能有表名做修饰“LEFTOUTERJOIN”表示左外连接操作,表示最终生成的虚拟表的行包括左表(BOOK_TABLE)的全部和右表(AUTHOR_TABLE)满足特定条件的行“ON”后面的语句表示了记录需要满足的特定条件,AUTHOR_TABLE表的纪录的“_ID”列的值必须等于BOOK_TABLE表的纪录的“AUTHOR_ID”列的值61实例:出版社管理系统(7)execSQL方法insert方法62db.execSQL("INSERTINTO"+Publisher.AUTHOR_TABLE+"(author_name,address,phone)"+"VALUES("+"‵"+name+"',"+"'"+address+"',"+"'"+phone+"'"+")");ContentValuesvalues=newContentValues();values.put(Publisher.AUTHOR.NAME,name);values.put(Publisher.AUTHOR.ADDRESS,address);values.put(Publisher.AUTHOR.PHONE,phone);SQLiteDatabasedb=helper.getWritableDatabase();db.insert(Publisher.AUTHOR_TABLE,null,values);实例:出版社管理系统(8)SQLiteDatabase类的execSQL方法直接操作SQL语句,SQLiteDatabase类的longinsert(Stringtable,StringnullColumnHack,ContentValuesvalues)方法简化插入操作第一个参数是需要新增数据的表第二个参数表示一个列名,因为SQLite数据库不允许增加没有任何内容的记录,所以如果插入的values值为空,则nullColumnHack表示的列的值将被赋为NULL,并将该记录插入到数据库中第三个参数是一个ContentValues对象,它和哈希表类似,负责存储键值(key/value)对,将需要存储的数据进行封装两种插入记录的方法没有给出记录的“_id”值数据表AUTHOR_TABLE含有_ID列因为SQLite数据库会按递增的顺序为新增记录自动添加这个序号值,这个序号是记录唯一性的标识。SQL表达式中的表示输入值的字符串一定要用单引号包括起来,否则数据库会出现故障63实例:出版社管理系统(9)execSQL方法delete方法(不使用通配符)delete方法(使用通配符)64db.execSQL("DELETEFROM"+Publisher.AUTHOR_TABLE+"WHERE"+AUTHOR._ID+"="+author_id);db.delete(Publisher.AUTHOR_TABLE,Publisher.AUTHOR._ID+"="+author_id,null);db.delete(Publisher.AUTHOR_TABLE,Publisher.AUTHOR._ID+"=?",newString[]{String.valueOf(author_id)});实例:出版社管理系统(10)execSQL方法update方法65db.execSQL("UPDATE"+Publisher.AUTHOR_TABLE+"SET"+AUTHOR.NAME+"='"+name+"'"+","+AUTHOR.ADDRESS+"='"+address+"'"+","+AUTHOR.PHONE+"='"+phone+"'"+"WHERE"+AUTHOR._ID+"="+id);ContentValuesvalues=newContentValues();values.put(Publisher.AUTHOR.NAME,name);values.put(Publisher.AUTHOR.ADDRESS,address);values.put(Publisher.AUTHOR.PHONE,phone);SQLiteDatabasedb=helper.getWritableDatabase();db.update(Publisher.AUTHOR_TABLE,values,Publisher.AUTHOR._ID+"="+id,null);实例:出版社管理系统(11)SQLiteDatabase提供了Cursorquery(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)方法实现查询记录table代表查询的数据表Columns代表要查询的列数组selection代表查询的条件,可以使用“?”通配符selectionArgs代表selection表达式中的?groupBy代表数据分组Having代表哪些行显示orderBy代表排序的方式66实例:出版社管理系统(12)Cursor类用于对数据库查询的结果进行随机的读写访问默认情况下Cursor的游标位于返回的所有数据行的前面Cursor常用方法move(intoffset)将当前游标移动offset个位置moveToFirst()将游标移动到第一行moveToLast()将游标移动到最后一行isLast()判断游标是否在最后一行isFirst()判断游标是否在第一行getPosition()获得游标当前所在行的位置getCount()获得cursor中的所有行数67实例:字典实例:字典SQLite(7)SQLite的数据类型动态数据类型根据存入值自动判断SQLite数据类型5种NULL空值INTEGER带符号的整型,具体取决有存入数字的范围大小REAL浮点数字,存储为8-byteIEEE浮点数TEXT字符串文本BLOB二进制对象70手动建立与使用SQLite数据库手动创建SQLite数据库Android提供了sqlite3工具使用sqlite3工具通过输入命令(命令行方式)建立SQLite数据库Sqlite3SQLite数据库自带命令行方式SQL命令执行工具可以显示命令执行结果通过命令行输入sqlite3可启动sqlite3工具,并得到工具的版本信息,CMD中输入命令71手动建立与使用SQLite数据库(2)启动sqlite3工具后命令行界面进入与SQLite数据库的交互模式可以输入命令建立、删除或修改数据库的内容退出sqlite3工具使用.exit命令应用程序的数据库保存位置在应用程序的/data/data/<packagename>/databases目录下使用手工方式建立数据库,必须手工建立数据库目录目前版本无须修改数据库目录的权限72手动建立与使用SQLite数据库(3)打开时创建使用sqlite3工具后加文件名的方式打开数据库文件如果指定文件不存在,sqlite3工具自动创建新文件创建名为people的数据库在文件系统中将产生一个名为people.db的数据库文件73#sqlite3people.dbSQLiteversionEnter“.help”forinstructionssqlite>手动建立与使用SQLite数据库(4)表的创建在新创建的数据库中创建名为表peopleinfo使用createtable命令关系模式为peopleinfo(_id,name,age,height)表包含四个属性_id是整型的主键name表示姓名,字符型,notnull表示属性不能为空age表示年龄,整数型height表示身高,浮点型74sqlite>createtablepeopleinfo...>(_idintegerprimarykeyautoincrement,...>nametextnotnull,...>ageinteger,...>heightfloat);sqlite>手动建立与使用SQLite数据库(5)确认数据表是否创建成功使用.tables命令,显示当前数据库中的所有表当前数据库仅有一个名为peopleinfo的表或者使用.

温馨提示

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

评论

0/150

提交评论