版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 数据存储和访问本章结构:简单存储——SharedPreferences文件存储数据库存储——SQLite数据共享——ContentProvider简单存储——SharedPreferencesSharedPreferences简介一种轻量级的数据保存方式可以将NVP(Name/ValuePair,名称/值对)保存在
Android的文件系统中,而且SharedPreferences完全屏蔽的对文件系统的操作过程开发人员仅是通过调用SharedPreferences对NVP进行保存和读取SharedPreferences不仅能够保存数据,还能够实现不同应用程序间的数据共享用户SharedPreference文件系统/data/data/<package
name>/shared_prefs/简单存储——SharedPreferencesSharedPreferences使用名称模式Context::getSharedPreferences(
)commit()get<Type>()put<Type>()SharedPreferences内部类:Editor写数据读数据SharedPreferences支持三种访问模式私有(MODE_PRIVATE):仅创建程序有权限对其进行读取或写入全局读(MODE_WORLD_READABLE):不仅创建程序可以对其进行读取或写入,其他任何应用程序也读取操作的权限,但没有写入操作的权限全局写(MODE_WORLD_WRITEABLE):创建程序和其他任何程序都可以对其进行写入操作,但没有读取的权限简单存储——SharedPreferencesSharedPreferences的使用定义SharedPreferences的访问模式定义SharedPreferences的名称,这个名称与在Android文件系统中保存的文件同名。因此,只要具有相同的
SharedPreferences名称的NVP内容,都会保存在同一个文件中Context.MODE_WORLD_WRITEABLE;简单存储——SharedPreferences私有模式publicstatic
int
MODE
=
Context.MODE_PRIVATE;public
static
int
MODE
=
Context.MODE_WORLD_READABLE
+全局读写模式public
static
finalStringPREFERENCE_NAME
="SaveSetting";获取SharedPreferences对象——通过getSharedPreferences()函数修改:SharedPreferences.Editor类保存:mit()SharedPreferences广泛支持各种基本数据类型,包括整型、布尔型、浮点型和长型等等SharedPreferences
sharedPreferences
=
getSharedPreferences(PREFERENCE_NAME,
MODE);模式名称简单存储——SharedPreferencesSharedPreferences.Editor
editor
=
sharedPreferences.edit();editor.putString("Name",
"Tom");editor.putInt("Age",
20);editor.putFloat(“Height”,
1.81f);mit();读取数据——SharedPreferences::
get<Type>()第1个参数是NVP的名称第2个参数是在无法获取到数值的时候使用的缺省值SharedPreferences
sharedPreferences
=
getSharedPreferences(PREFERENCE_NAME,MODE);Stringname
=
sharedPreferences.getString("Name","Default
Name");int
age
=
sharedPreferences.getInt("Age",
20);float
height
=sharedPreferences.getFloat(“Height”,
1.81f);简单存储——SharedPreferences获取SharedPreferences对象get<Type>()——读取数据SimplePreferenceDemo示例下图是SimplePreferenceDemo示例的用户界面用户在界面上的输入的信息,将通过SharedPreferences在Activity关闭时进行保存。当应用程序重新开启时,保存在SharedPreferences的信息将被读取出来,并重新呈现在用户界面上简单存储——SharedPreferencesSimplePreferenceDemo示例运行后,通过FileExplorer查看/data/data下的数据,Android为每个应用程序建立了与包同名的目录,用来保存应用程序产生的数据,这些数据包括文件、SharedPreferences文件和数据库等SharedPreferences文件就保存在/data/data/<packagename>/shared_prefs目录下简单存储——SharedPreferences在本示例中,shared_prefs目录下生成了一个名为SaveSetting.xml的文件这个文件就是保存SharedPreferences的文件,文件大小为170字节,在Linux下的权限为“-rw-rw-rw”简单存储——SharedPreferences在Linux系统中,文件权限分别描述了创建者、同组用户和其他用户对文件的操作限制。x表示可执行,r表示可读,w表示可写,d表示目录,-表示普通文件。因此,“-rw-rw-rw”表示SaveSetting.xml可以被创建者、同组用户和其他用户进行读取和写入操作,但不可执行产生这样的文件权限与程序人员设定的
SharedPreferences的访问模式有关,“-rw-rw-rw”的权限是“全局读+全局写”的结果如果将SharedPreferences的访问模式设置为私有,则文件权限将成为“-rw-rw---”,表示仅有创建者和同组用户具有读写文件的权限简单存储——SharedPreferencesSaveSetting.xml文件是以XML格式保存的信息,内容如图如下<?xml
version='1.0'
encoding='utf-8'
standalone='yes'
?><map><float
name="Height"
value="1.81"
/><string
name="Name">Tom</string><int
name="Age"
value="20"
/></map>简单存储——SharedPreferences在onStart()函数中调用loadSharedPreferences()函数,读取保存在SharedPreferences中的姓名、年龄和身高信息,并显示在用户界面上当Activity关闭时,在onStop()函数调用saveSharedPreferences(),保存界面上的信息SimplePreferenceDemo.java的完整代码1. package
edu.hrbeu.SimplePreferenceDemo;2.import
android.app.Activity;import
android.content.Context;import
android.content.SharedPreferences;import
android.os.Bundle;import
android.widget.EditText;简单存储——SharedPreferences8.9. public
class
SimplePreferenceDemo
extends
Activity
{10.11.12.13.14.15.private
EditText
nameText;private
EditText
ageText;private
EditText
heightText;public
static
finalStringPREFERENCE_NAME
="SaveSetting";public
static
int
MODE
=
Context.MODE_WORLD_READABLE
+Context.MODE_WORLD_WRITEABLE;16.17.18.19.20.21.22.23.24.@Overridepublic
void
onCreate(Bundle
savedInstanceState)
{super.onCreate(savedInstanceState);setContentView(R.layout.main);nameText
=(EditText)findViewById(R.);ageText
=(EditText)findViewById(R.id.age);heightText
=
(EditText)findViewById(R.id.height);}简单存储——SharedPreferences@Overridepublic
void
onStart(){super.onStart();loadSharedPreferences();}@Overridepublic
void
onStop(){super.onStop();saveSharedPreferences();}25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.private
void
loadSharedPreferences(){SharedPreferences
sharedPreferences
=getSharedPreferences(PREFERENCE_NAME,
MODE);String
name
=
sharedPreferences.getString("Name","Tom");int
age
=
sharedPreferences.getInt("Age",
20);float
height
=sharedPreferences.getFloat("Height",);简单存储——SharedPreferences42.nameText.setText(name);ageText.setText(String.valueOf(age));heightText.setText(String.valueOf(height));}private
void
saveSharedPreferences(){SharedPreferences
sharedPreferences
=
getSharedPreferences(PREFERENCE_NAME,MODE);SharedPreferences.Editor
editor
=
sharedPreferences.edit();editor.putString("Name",
nameText.getText().toString());editor.putInt("Age",
Integer.parseInt(ageText.getText().toString()));editor.putFloat("Height",Float.parseFloat(heightText.getText().toString()));mit();}}简单存储——SharedPreferences示例SharePreferenceDemo示例将读取SimplePreferenceDemo示例保存的信息,并在程序启动时显示在用户界面上简单存储——SharedPreferences下面给出SharePreferenceDemo示例的核心代码public
static
final
String
PREFERENCE_PACKAGE
="edu.hrbeu.SimplePreferenceDemo";public
static
finalStringPREFERENCE_NAME
="SaveSetting";public
static
int
MODE
=
Context.MODE_WORLD_READABLE
+Context.MODE_WORLD_WRITEABLE;9.10.11.12.4.public
void
onCreate(Bundle
savedInstanceState)
{Context
c
=null;try
{
c
=this.createPackageContext(PREFERENCE_PACKAGE,Context.CONTEXT_IGNORE_SECURITY);}
catch
(NameNotFoundException
e)
{e.printStackTrace();}SharedPreferences
sharedPreferences
=c.getSharedPreferences(PREFERENCE_NAME,
MODE);简单存储——SharedPreferences获取Context13.14.15.String
name
=
sharedPreferences.getString("Name","Tom");int
age
=
sharedPreferences.getInt("Age",
20);float
height
=sharedPreferences.getFloat("Height",);16.17.18.String
msg=“姓名:”+String.valueof(name)+“\n”+“年龄:”+String.valueof(age)+“\n”+“身高:”+String.valueof(height);textView.setText(msg);19.20.
}简单存储——SharedPreferences第8行代码调用了createPackageContext()获取到了SimplePreferenceDemo示例的Context第8行代码第1个参数是SimplePreferenceDemo的包名称,在代码第1行进行了定义第2个参数Context.CONTEXT_IGNORE_SECURIT表示忽略所有可能产生的安全问题。这段代码可能引发异常,因此必须防止在try/catch中简单存储——SharedPreferences在代码第12行,通过Context得到了SimplePreferenceDemo示例的SharedPreferences对象,同样在getSharedPreferences()函数中,需要将正确的SharedPreferences名称传递给函数访问其他应用程序的SharedPreferences必须满足三个条件共享者需要将SharedPreferences的访问模式设置为全局读或全局写访问者需要知道共享者的包名称和SharedPreferences的名称,以通过Context获得SharedPreferences对象访问者需要确切知道每个数据的名称和数据类型,用以正确读取数据简单存储——SharedPreferences文件存储Android使用的是基于Linux的文件系统,程序开发人员可以程序自身的私有文件的读写保存在资源目录中的原始文件和XML文件的读写SD卡等外部存储设备中文件的读写文件存储内部存储——程序自身的私有文件私有文件:文件保存在设备的内部存储器上,在Linux系统下的/data/data/<package
name>/files目录中Android系统不仅支持标准Java的IO类和方法还提供了能够简化读写流式文件过程的函数openFileOutput()openFileInput()。。。名称模式FileOutputStreamopenFileOutput名称FileInputStreamopenFileInputwrite()flush()close()read()close()写数据读数据文件路径:/data/data/<package
name>/files/文件存储openFileOutput()函数为写入数据做准备而打开的应用程序私文件,如果指定的文件不存在,则创建一个新的文件语法格式:第1个参数:文件名称,这个参数不可以包含描述路径的斜杠第2个参数:操作模式函数的返回值:FileOutputStream对象public
FileOutputStream
openFileOutput(String
name,
int
mode)文件存储Android系统支持四种文件操作模式模式说明MODE_PRIVATE私有模式,缺省模式,文件仅能够被文件创建程序访问,或具有相同UID的程序访问。MODE_APPEND追加模式,如果文件已经存在,则在文件的结尾处添加新数据。MODE_WORLD_READABLE全局读模式,允许任何程序读取私有文件。MODE_WORLD_WRITEABLE全局写模式,允许任何程序写入私有文件。文件存储示例代码:FileOutputStream常用函数:String
FILE_NAME
=
"fileDemo.txt";FileOutputStream
fos
=
openFileOutput(FILE_NAME,Context.
MODE_PRIVATE)String
text
=
“Somedata”;fos.write(text.getBytes());fos.flush();fos.close();文件名称操作模式函数功能write(…)写数据flush(
)刷清数据,调用close()之前,务必要调用close(
)关闭FileOutputStream文件存储openFileInput()函数为读取数据做准备而打开应用程序私文件语法格式:第1个参数:文件名称,这个参数不可以包含描述路径的斜杠返回值:FileInputStream对象常用函数:public
FileInputStream
openFileInput(String
name)函数功能read(…)读数据close(
)关闭FileInputStream文件存储示例代码:String
FILE_NAME
=
"fileDemo.txt";FileInputStream
fis
=
openFileInput(FILE_NAME);3.byte[]
readBytes
=newbyte[fis.available()];while(fis.read(readBytes)
!=
-1){}因为文件操作可能会遇到各种问题而最终导致操作失败,因此代码应该使用try/catch捕获可能产生的异常文件存储InternalFileDemo示例用来演示在内部存储器上进行文件写入和读取文件FileOutputStreamFileInputStream文件存储InternalFileDemo示例的核心代码OnClickListener
writeButtonListener
=
new
OnClickListener()
{@Overridepublic
void
onClick(View
v)
{FileOutputStream
fos
=
null;try
{if
(appendBox.isChecked()){fos
=
openFileOutput(FILE_NAME,Context.MODE_APPEND);}else
{fos=openFileOutput(FILE_NAME,Context.MODE_PRIVATE);10.
}String
text
=
entryText.getText().toString();fos.write(text.getBytes());labelView.setText("文件写入成功,写入长度:"+text.length());entryText.setText("");}
catch
(FileNotFoundException
e)
{文件存储e.printStackTrace();}catch
(IOException
e)
{e.printStackTrace();}finally{if
(fos
!=
null){try
{fos.flush();fos.close();}
catch
(IOException
e)
{e.printStackTrace();}}}}16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.
};文件存储OnClickListener
readButtonListener
=
new
OnClickListener()
{@Overridepublic
void
onClick(View
v)
{displayView.setText("");FileInputStream
fis
=null;try
{fis
=openFileInput(FILE_NAME);if
(fis.available()
==
0){return;42.
}byte[]
readBytes
=
new
byte[fis.available()];while(fis.read(readBytes)
!=
-1){}String
text
=
new
String(readBytes);displayView.setText(text);labelView.setText("文件读取成功,文件长度:"+text.length());}
catch
(FileNotFoundException
e)
{文件存储程序运行后,在/data/data/edu.hrbeu.InternalFileDemo/files/目录下,找到了新建立的fileDemo.txt文件50.e.printStackTrace();51.}52.catch
(IOException
e)
{53.e.printStackTrace();54.}55.}56.
};文件存储fileDemo.txt文件fileDemo.txt从文件权限上进行分析,“-rw-rw---”表明文件仅允许文件创建者和同组用户读写,其他用户无权使用文件的大小为9个字节,保存的数据为“Some
data”文件存储外部存储Android的外部存储设备指的是SD卡(Secure
DigitalMemoryCard),是一种广泛使用于数码设备上的记忆卡不是所有的Android手机都有SD卡,但Android系统提供了对SD卡的便捷的访问方法文件存储SD卡适用于保存大尺寸的文件或者是一些无需设置访问权限的文件,可以保存录制的大容量的视频文件和音频文件等SD卡使用的是FAT(File
Allocation
Table)的文件系统,不支持访问模式和权限控制,但可以使用内部存储器,该存储器采用Linux文件系统,可以设置文件访问权限,保证文件的私密性Android模拟器支持SD卡,但模拟器中没有缺省的SD卡,开发人员须在模拟器中手工添加SD卡的映像文件文件存储访问SD卡权限设置——AndroidManifest.xml1.
….
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>…文件存储编程访问SD卡——File类首先需要检测系统的/sdcard目录是否可用如果不可用,则说明设备中的SD卡已经被移除,在Android模拟器则表明SD卡映像没有被正确加载如果可用,则直接通过使用标准的Java.io.File类进行访问Java.io.FileFile(…)CreateNewFile(…)exists(…)canWrite(…)文件存储将数据读取/保存在SD卡——FileInput(Output)Stream通过“生产随机数列”按钮生产10个随机小数通过“写入SD卡”按钮将生产的数据保存在SD卡的目录下SDcardFileDemo示例说明了如何将数据保存在SD卡Java.io.FileFileInputStreamread()close()FileOutputStreamwrite()flush()close()文件存储下图是SDcardFileDemo示例的用户界面文件存储SDcardFileDemo示例运行后,在每次点击“写入SD卡”按钮后,都会在SD卡中生产一个新文件,文件名各不相同SD卡中生产的文件文件存储SDcardFileDemo示例与InternalFileDemo示例的核心代码比较相似SDcardFileDemo示例与InternalFileDemo示例的不同之处第7行代码中添加了/sdcard目录存在性检查第8行代码使用“绝对目录+文件名”的形式表示新建立的文件第12行代码写入文件前对文件存在性和可写入性进行检查第5行代码为了保证在SD卡中多次写入时文件名不会重复,在文件名中使用了唯一且不重复的标识,这个标识通过调用System.currentTimeMillis()函数获得,表示从1970年00:00:00到当前所经过的毫秒数文件存储下面是SDcardFileDemo示例的核心代码OnClickListener
writeButtonListener
=
new
OnClickListener(){@Overridepublic
void
onClick(View
v)
{String
fileName
=
"SdcardFile-"+System.currentTimeMillis()+".txt";File
dir
=
newFile("/sdcard/");if(dir.exists()
&&dir.canWrite())
{File
newFile
=
new
File(dir.getAbsolutePath()
+
"/"
+fileName);FileOutputStream
fos
=
null;displayView.setText(randomNumbersString); //显示随机数private
static
String
randomNumbersString
=
"";OnClickListener
randomGetButtonListener
=
new
OnClickListener()
{@Overridepublic
void
onClick(View
v)
{randomNumbersString=String.valueOf(Math.random());//产生随机数
6.7.
}8.
});文件存储try
{newFile.createNewFile();3.if
(newFile.exists()
&&
newFile.canWrite())
{4.fos
=newFileOutputStream(newFile);5.fos.write(randomNumbersString.getBytes());15.labelView.setText(fileName+"文件写入SD卡");16.}17.}
catch
(IOException
e)
{18.e.printStackTrace();19.}
finally
{20.if
(fos
!=
null)
{21.try{22.fos.flush();23.fos.close();24.}25.catch
(IOExceptione){
}26.}27.}28.}29.30.
};}文件存储资源文件程序开发人员可以将程序开发阶段已经准备好的原始格式文件和XML文件分别存放在/res/raw和/res/xml目录下,供应用程序在运行时进行访问原始格式文件可以是任何格式的文件,例如视频格式文件、音频格式文件、图像文件和数据文件等等,在应用程序编译和打包时,/res/raw目录下的所有文件都会保留原有格式不变/res/xml目录下的XML文件,一般用来保存格式化的数据,在应用程序编译和打包时会将XML文件转换为高效的二进制格式,应用程序运行时会以特殊的方式进行访问文件存储原始格式资源文件(raw)读取ResourceInputStreamthis.getResources();openRawResource();read()close()文件存储ResourceFileDemo示例演示了如何在程序运行时访问资源文件当用户点击“读取原始文件”按钮时,程序将读取/res/raw/raw_file.txt文件,并将内容显示在界面上文件存储下面是ResourceFileDemo示例的核心代码final
Resources
resource
=
this.getResources();button1.setOnClickListener(new
View.OnClickListener()
{@Overridepublic
void
onClick(View
v)
{//
TODO
Auto-generated
method
stubtry
{InputStream
inputStream
=
resource.openRawResource(R.raw.raw_file);byte
[]
reader
=
new
byte[inputStream.available()];while(inputStream.read(reader)
!=
-1)10. {
}textView02.setText(new
String(reader,
“utf-8”));inputStream.close();……文件存储读取原始格式文件,首先需要调用getResource()函数获得资源对象,然后通过调用资源对象的
openRawResource()函数,以二进制流的形式打开指定的原始格式文件。在读取文件结束后,调用close()函数关闭文件流ResourceFileDemo示例中关于读取原始格式文件的核心代码如下Resources
resources
=
this.getResources();InputStream
inputStream
=null;try
{inputStream
=
resources.openRawResource(R.raw.raw_file);byte[]
reader
=newbyte[inputStream.available()];while
(inputStream.read(reader)
!=-1)
{}文件存储labelView.setText(new
String(reader,"utf-8"));}
catch
(IOException
e)
{Log.e("ResourceFileDemo",
e.getMessage(),
e);}
finally
{if
(inputStream
!=
null)
{try
{inputStream.close();15.
}catch
(IOExceptione){
}}18.
}代码第8行的new
String(reader,"utf-8"),表示以UTF-8的编码方式,从字节数组中实例化一个字符串程序开发人员需要确定/res/raw/raw_file.txt文件使用的是UTF-8编码方式,否则程序运行时会产生乱码文件存储确认的方法右击raw_file.txt文件选择“Properties”打开raw_file.txt文件的属性设置框在Resource栏下的Text
file
encoding中,选择“Other:UTF-8”文件存储当用户点击“读取XML文件”按钮时,程序将读取/res/xml/people.xml文件,并将内容显示在界面上文件存储/res/xml目录下的XML文件会转换为一种高效的二进制格式说明如何在程序运行时读取/res/xml目录下的XML文件首先在/res/xml目录下创建一个名为people.xml的文件XML文件定义了多个<person>元素,每个<person>元素都包含三个属性name、age和height,分别表示姓名、年龄和身高/res/xml/people.xml文件代码如下<people><person
name="李某某"age="21"
height="1.81"/><person
name="王某某"age="25"
height="1.76"/><person
name="张某某"age="20"
height="1.69"/></people>根节点名称属性一条元素文件存储读取XML格式文件ResourceXmlPullParserthis.getResources();getXml();next()getName()getAttrCount()getAttrName()getAttrValue()属性元素名称下一个文件存储读取XML格式文件首先通过调用资源对象的getXml()函数,获取到XML解析器XmlPullParserXmlPullParser是Android平台标准的XML解析器,这项技术来自一个开源的XML解析API项目XMLPULLResourceFileDemo示例中关于读取XML文件的核心代码如下XmlPullParser
parser
=
resources.getXml(R.xml.people);String
msg
=
"";try
{while
(parser.next()
!=
XmlPullParser.END_DOCUMENT)
{String
people=
parser.getName();String
name
=
null;文件存储7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.String
age
=null;String
height
=
null;if
((people
!=
null)
&&
people.equals("person"))
{int
count=parser.getAttributeCount();for
(int
i
=0;i
<count;
i++){String
attrName
=
parser.getAttributeName(i);String
attrValue
=
parser.getAttributeValue(i);if
((attrName
!=null)
&&
attrName.equals("name"))
{name
=attrValue;}else
if
((attrName
!=null)
&&
attrName.equals("age"))
{age
=attrValue;}else
if
((attrName
!=null)
&&
attrName.equals("height"))
{height=attrValue;}}if
((name
!=
null)
&&
(age
!=
null)
&&
(height
!=
null))
{msg+="姓名:"+name+",年龄:"+age+",身高:"+height+"\n";文件存储}}24.25.26.}}
catch
(Exceptione){Log.e("ResourceFileDemo",
e.getMessage(),
e);29.
}displayView.setText(msg);第1行代码通过资源对象的getXml()函数获取到XML解析器第4行代码的parser.next()方法可以获取到高等级的解析事件,并通过对比确定事件类型第5行代码使用getName()函数获得元素的名称第10行代码使用getAttributeCount()函数获取元素的属性数量文件存储第12行代码通过getAttributeName()函数得到属性名称第14行到第19行代码通过分析属性名获取到正确的属性值第23行代码将属性值整理成需要显示的信息XmlPullParser的XML事件类型事件类型说明START_TAG读取到标签开始标志TEXT读取文本内容END_TAG读取到标签结束标志END_DOCUMENT文档末尾数据库存储SQLite数据库SQLite是一个开源的嵌入式关系数据库,在2000年由D.Richard
Hipp发布SQLite数据库特点更加适用于嵌入式系统,嵌入到使用它的应用程序中占用资源非常少,运行高效可靠,可移植性好提供了零配置(zero-configuration)运行模式SQLite数据库易用性:不仅提高了运行效率,而且屏蔽了数据库使用和管理的复杂性,程序仅需要进行最基本的数据操作,其他操作可以交给进程内部的数据库引擎完成数据库存储SQLite数据库采用了模块化设计,由8个独立的模块构成,这些独立模块又构成了三个主要的子系统,模块将复杂的查询过程分解为细小的工作进行处理数据库存储接口由SQLiteC
API组成,因此无论是应用程序、脚本,还是库文件,最终都是通过接口与SQLite交互编译器由分词器和分析器组成分词器和分析器对SQL语句进行语法检查,然后把SQL语句转化为底层能更方便处理的分层的数据结构,这种分层的数据结构称为“语法树”把语法树传给代码生成器进行处理,生成一种针对SQLite的汇编代码最后由虚拟机执行数据库存储虚拟机SQLite数据库体系结构中最核心的部分是虚拟机,也称为虚拟数据库引擎(Virtual
Database
Engine,VDBE)与Java虚拟机相似,虚拟数据库引擎用来解释执行字节代码虚拟数据库引擎的字节代码由128个操作码构成,这些操作码主要用以对数据库进行操作,每一条指令都可以完成特定的数据库操作,或以特定的方式处理栈的内容数据库存储后端后端由B-树、页缓存和操作系统接口构成B-树的主要功能就是索引,它维护着各个页面之间的复杂的关系,便于快速找到所需数据页缓存的主要作用就是通过操作系统接口在B-树和磁盘之间传递页面B-树和页缓存共同对数据进行管理数据库存储SQLite数据库具有很强的移植性,可以运行在Windows,Linux,BSD,Mac
OS
X和一些商用Unix系统,比如
Sun的Solaris,IBM的AIXSQLite数据库也可以工作在许多嵌入式操作系统下,例如QNX,VxWorks,Palm
OS,Symbin和Windows
CESQLite的核心大约有3万行标准C代码,模块化的设计使这些代码更加易于理解数据库存储数据库表(属性)数据创建 创建打开 打开操作插入删除更新查询…数据库概念回顾:Android数据库操作手工操作代码操作数据库存储手动建库使用sqlite3工具,通过命令行完成数据库的建立过程sqlite3是SQLite数据库自带的一个基于命令行的SQL命令执行工具,并可以显示命令执行结果启动sqlite3工具:sqlite3工具被集成在Android系统中,用户在Linux的命令行界面中输入sqlite3启动Linux的命令行界面:CMD中输入adb
shell命令启动sqlite3工具:输入sqlite3#sqlite3SQLite
versionEnter
“.help”
for
instructionssqlite>数据库存储正确退出sqlite3工具的方法是使用.exit命令原则上,每个应用程序的数据库都保存在各自的/data/data/<packagename>/databases目录下,但如果使用手工方式建立数据库,则必须手工建立数据库目录,目前版本无须修改数据库目录的权限sqlite>
.exit#rootsystem2009-07-18
15:43
databases2009-07-1815:31
lib#mkdir
databases#ls
–ldrwxrwxrwx
rootdrwxr-xr-x
system#数据库存储在SQLite数据库中,每个数据库保存在一个独立的文件中,使用sqlite3工具后加文件名的方式打开数据库文件,如果指定文件不存在,sqlite3工具则自动创建新文件下面的代码将创建名为people的数据库,在文件系统中将产生一个名为people.db的数据库文件#sqlite3
people.dbSQLite
versionEnter
“.help”
for
instructionssqlite>数据库存储创建数据库:create
table命令下面的代码在新创建的数据库中,构造了一个名为peopleinfo的表,关系模式为peopleinfo(_id,name,age,height)表包含四个属性,_id是整型的主键;name表示姓名,字符型,notnull表示这个属性一定要填写,不可以为空值;age表示年龄,整数型;height表示身高,浮点型sqlite>
create
table
peopleinfo...>
(_idinteger
primary
keyautoincrement,...>
name
text
not
null,...>
age
integer,...>
height
float);sqlite>数据库存储为了确认数据表是否创建成功,可以使用.tables命令,显示当前数据库中的所有表从下面的代码中可以观察到,当前数据库仅有一个名为peopleinfo的表当然,也可以使用.schema命令查看建立表时使用的
SQL命令。如果当前数据库中包含多个表,则可以使用
[.schema表名]的形式,显示指定表的建立命令sqlite>
.tablespoepleinfosqlite>sqlite>.schemaCREATE
TABLE
peopleinfo
(_id
integer
primary
keyautoincrement,name
text
not
null,
age
integer,
height
float);sqlite>数据库存储添加数据,使用insert
into…values命令代码运行成功后,数据库的peopleinfo表将有三条数据。因为_id是自增加的主键,因此在输入null后,SQLite数据库会自动填写该项的内容sqlite>
insert
intopeopleinfo
values(null,'Tom',21,1.81);sqlite>
insert
intopeopleinfo
values(null,'Jim',22,1.78);sqlite>
insert
intopeopleinfo
values(null,'Lily',19,1.68);_idnameageheight1Tom211.812Jim221.783Lily191.68数据库存储Select命令:显示指定数据表中的所有数据信息,命令格式为:[select
属性from
表名]select*
frompeopleinfo;1|Tom|21|1.812|Jim|22|1.783|Lily|19|1.68sqlite>数据库存储mode命令:将结果输出格式更改为“表格”方式mode命令除了支持常见的column格式为,还支持csv格式、html格式、insert格式、line格式、list格式、tabs格式和tcl格式sqlite>
.mode
columnsqlite>select
*
from
peopleinfo;3.
1Tom211.814.
2Jim221.785.
3Lily191.686.
sqlite>数据库存储更新数据——update命令:命令格式为[update
表名set
属性=“新值”where条件]更新数据后,同样使用select命令显示数据,则可以确定数据是否正确更新下面的代码将姓名为Lily数据中的高度值更新为1.88sqlite>update
peopleinfosetheight=1.88
where
name="Lily";sqlite>select
*
from
peopleinfo;select*
frompeopleinfo;4.
1Tom211.815.
2Jim221.786.
3Lily191.887.
sqlite>数据库存储delete命令:删除数据可以使用命令格式:[delete
from
表名where
条件]下面的代码将_id为3数据从表peopleinfo中删除TomJim21221.811.78sqlite>deletefrom
peopleinfowhere
_id=3;sqlite>select
*
from
peopleinfo;select*
frompeopleinfo;12sqlite>数据库存储sqlite3工具还支持大量的命令,可以使用.help命令查询
sqlite3的命令列表编号命令说明1.bail
ON|OFF遇到错误时停止,缺省为OFF2.databases显示数据库名称和文件位置3.dump
?TABLE?
...将数据库以SQL文本形式导出4.echo
ON|OFF开启和关闭回显5.exit退出6.explain
ON|OFF开启或关闭适当输出模式,如果开启模式将更改为column,并自动设置宽度数据库存储编号命令说明7.header(s)
ON|OFF开启或关闭标题显示8.help显示帮助信息9.import
FILE
TABLE将数据从文件导入表中10.indices
TABLE显示表中所的列名11.load
FILE
?ENTRY?导入扩展库12.mode
MODE?TABLE?设置输入格式13.nullvalue
STRING打印时使用STRING代替NULL14.output
FILENAME将输入保存到文件15.output
stdout将输入显示在屏幕上16.prompt
MAINCONTINUE替换标准提示符数据库存储编号命令说明17.quit退出18.read
FILENAME在文件中执行SQL语句19.schema?TABLE?显示表的创建语句20.separator
STRING更改输入和导入的分隔符21.show显示当前设置变量值22.tables
?PATTERN?显示符合匹配模式的表名23.timeout
MS尝试打开被锁定的表MS毫秒24.timer
ON|OFF开启或关闭CPU计时器25.width
NUM
NUM
...设置column模式的宽度数据库存储添加、更查询新、删除和等操作AppDBAdapterSQLiteDatabaseSQLiteOpenHelper打开/创建操作代码建库在代码中动态建立数据库是比较常用的方法在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库在编程实现时,一般将所有对数据库的操作都封装在一个类中,因此只要调用这个类,就可以完成对ge数tWri据tabl库eDa的tabasegetReadableDatabase添加删除查询更新ContentValuesCursor数据库存储SQLiteDemo是对数据库操作的一个示例ContentValues多条数据处理单条数据处理输入输出操作数据库存储下面内容是DBAdapter类的部分代码,封装了数据库的建立、打开和关闭数据库及数据库各种操作1. public
class
DBAdapter
{private
staticfinal
String
DB_NAME
=
"people.db";private
static
finalString
DB_TABLE
=
"peopleinfo";private
static
finalint
DB_VERSION
=
1;public
static
finalString
KEY_ID
=
"_id";public
static
final
String
KEY_NAME
=
"name";public
static
final
String
KEY_AGE
=
"age";public
staticfinal
String
KEY_HEIGHT
=
"height";2.3.4.5.6.7.8.9.10.11.private
Context
context;12.13.private
SQLiteDatabase
db;private
DBOpenHelper
dbOpenHelper;数据库名表名版本号属性数据库基本信息数据库类数据库打开帮助类数据库存储private
static
class
DBOpenHelper
extends
SQLiteOpenHelper
{}public
DBAdapter(Context
_context)
{context
=_context;}14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.//利用SQLiteOpenHelper打开数据库public
voidopen()
throws
SQLiteException
{dbOpenHelper
=
new
DBOpenHelper(context,
DB_NAME,
null,
DB_VERSION);try
{db=dbOpenHelper.getWritableDatabase();}catch
(SQLiteException
ex)
{db=dbOpenHelper.getReadableDatabase();}}30.publicvoid
close()
{//关闭数据库31.if
(db
!=null){32.db.close();33.db=null;34.}35.}36.
}数据库存储从代码的第2行到第9行可以看出,在DBAdapter类中首先声明了数据库的基本信息,包括数据库文件的名称、数据库表格名称和数据库版本,以及数据库表中的属性名称从这些基本信息上不难发现,这个数据库与前一小节手动建立的数据库是完全相同的数据库存储第11行代码声明了SQLiteDatabase对象db。SQLiteDatabase类封装了非常多的方法,用以建立、删除数据库,执行SQL命令,对数据进行管理等工作第13行代码声明了一个非常重要的帮助类
SQLiteOpenHelper,这个帮助类可以辅助建立、更新和打开数据库第21行代码定义了open()函数用来打开数据库,但open()函数中并没有任何对数据库进行实际操作的代码,而是调用了SQLiteOpenHelper::getWritableDatabase()函数和
getReadableDatabase()函数。这个两个函数会根据数据库是否存在、版本号和是否可写等情况,决定在返回数据库对象前,是否需要建立数据库数据库存储在代码第30行的close()函数中,调用了SQLiteDatabase对象的close()方法关闭数据库。这是上面的代码中,唯一的一个地方直接调用了SQLiteDatabase对象的方法SQLiteDatabase中也封装了打开数据库的函数
openDatabases()和创建数据库函数
openOrCreateDatabases(),因为代码中使用了帮助类
SQLiteOpenHelper,从而避免直接调用SQLiteDatabase中的打开和创建数据库的方法,简化了数据库打开过程中繁琐的逻辑判断过程代码第15行实现了内部静态类DBOpenHelper,继承了帮助类SQLiteOpenHelper数据库存储重载了onCreate()函数和onUpgrade()函数的代码如下private
static
class
DBOpenHelper
extends
SQLiteOpenHelper
{public
DBOpenHelper(Context
context,
String
name,
CursorFactory
factory,
int
version){super(context,
name,
factory,
version);}private
static
final
String
DB_CREATE
=
"create
table"
+6.7.DB_TABLE
+
"
("
+
KEY_ID
+
"
integer
primary
key
autoincrement,
"
+KEY_NAME+
"
text
not
null,
"
+
KEY_AGE+
"
integer,"
+
KEY_HEIGHT
+
"float);";8.@Overridepublicvoid
onCreate(SQLiteDatabase
_db){_db.execSQL(DB_CREATE);}13.“创建表”命令的组成执行命令数据库存储第5行到第7行代码的是创建表的SQL命令第10行和第15行代码分别重载了onCreate()函数和
onUpgrade()函数,这是继承SQLiteOpenHelper类必须重载的两个函数。onCreate()函数在数据库第一次建立时被调用,一般用来用来创建数据库中的表,并做适当的初始化工作@Overridepublic
void
onUpgrade(SQLiteDatabase
_db,
int
_oldVersion,
int
_newVersion)
{_db.execSQL("DROP
TABLE
IF
EXISTS
"
+
DB_TABLE);onCreate(_db);}14.15.16.17.18.19.
}数据库存储在代码第11行中,通过调用SQLiteDatabase对象的
execSQL()方法,执行创建表的SQL命令。onUpgrade()函数在数据库需要升级时被调用,一般用来删除旧的数据库表,并将数据转移到新版本的数据库表中第16行和第17行代码中,为了简单起见,并没有做任何的的数据转移,而仅仅删除原有的表后建立新的数据库表数据库存储程序开发人员不应直接调用onCreate()和onUpgrade()函数,而应该由SQLiteOpenHelper类来决定何时调用这两个函数SQLiteOpenHelper类的getWritableDatabase()函数和
getReadableDatabase()函数是可以直接调用的函数getWritableDataba
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44760-2024锆及锆合金管材超声检测方法
- 股东代持股协议书
- 2024年度虚拟化服务器租赁与桌面云服务协议2篇
- 化工设计-ASPEN软件:ASPEN PLUS模拟软件简介
- 人教版九年级化学第七单元过关训练课件
- 2024年度居间人工程保险合同3篇
- 二零二四年度建筑智能化弱电工程合同2篇
- 智能控制系统集成与灯具安装(2024年度)合同
- 人教版九年级化学第八单元金属和金属材料2金属的化学性质课时1金属与氧气、酸的反应教学课件
- 企业员工培训现状分析
- 国开(浙江)2024年秋《中国建筑史(本)》形考作业1-4答案
- 医院检验科实验室生物安全程序文件SOP
- 第9课-隋唐时期的经济、科技与文化-【中职专用】《中国历史》课件(高教版2023基础模块)
- 个人嘉奖登记(报告)表(无水印)
- 大队委竞选课件
- 基于PLC的燃油锅炉控制系统设计毕设设计说明书论文
- 小学生垃圾分类(全)(课堂PPT)
- 保险公司绩效考核办法
- 电度表检验报告格式(共4页)
- 鄂尔多斯市东胜区煤矿信息表
- 智慧城市-西安市城市运行大数据平台可研报告
评论
0/150
提交评论