Andriod数据存储的基本知识Word文档格式.docx
《Andriod数据存储的基本知识Word文档格式.docx》由会员分享,可在线阅读,更多相关《Andriod数据存储的基本知识Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
![Andriod数据存储的基本知识Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/30/af8b4d38-a9c7-45d4-a78b-6c484519ebef/af8b4d38-a9c7-45d4-a78b-6c484519ebef1.gif)
话,你可以使用这个方法,无需要提供识别的名称。
⏹使用SharedPreferences对象来获取数据非常简单,直接使用相应的getter方法
即可
⏹使用SharedPreferences对象来存储数据,大致有如下几步
调用edit()方法来得到SharedPreferences.Editor
调用相应的put方法值添加进去
调用commit来提交保存这些数据
使用SharedPreferences-2
⏹向SharedPreferences对象写入数据
SharedPreferencessp=getSharedPreferences("
SP"
Activity.MODE_PRIVATE);
SharedPreferences.Editoreditor=sp.edit();
editor.putString("
param1"
"
sp1"
);
editor.putInt("
param2"
222);
mit();
注意:
所有的写入操作应该在一个Editor里面,也就是不要调用多次sp.edit()方
法,每调用一次就会创建一个Editor
⏹在获得SharedPreferences对象的时候,需要指定文件创建的模式:
MODE_PRIVATE:
默认模式,文件只可以被调用该方法的应用程序访问
MODE_WORLD_READABLE:
赋予所有的应用程序都可以读取该文件
MODE_WORLD_WRITEABLE:
赋予所有的应用程序都可以写该文件
MODE_MULTI_PROCESS:
SharedPreference的装载标记,设置它,文件将会在
SharedPreference实例被装载到进程的时候检查是否被修改,主要用在一个应用
有多个进程的情况。
使用SharedPreferences-3
⏹从SharedPreferences对象读取数据
SharedPreferencessp=
T2.this.getSharedPreferences("
Stringp1=sp.getString("
"
"
intp2=sp.getInt("
0);
⏹SharedPreferences的数据以xml存储在data/data/包名/shared_prefs下面
InternalStorage-1
⏹当应用程序被安装到系统中后,其所在的包会有一个文件夹用于存放自己的数
据,只有这个应用程序才有对这个文件夹的写入权限,这个私有的文件夹位于
Android系统的/data/data/<
应用程序包名>
目录下,其他的应用程序都无法向这
个文件夹中写入数据。
⏹要读取应用自己的私有文件,就不能直接使用JavaI/O的API了,需要使用
Activity提供的方法:
openFileInput或openFileOutput。
⏹在使用openFileOutput方法的时候,需要指定打开的模式:
MODE_APPEND:
如果文件已存在就向该文件的末尾继续写入数据,而不是覆盖原
来的数据。
赋予所有的应用程序对该文件读的权限。
赋予所有的应用程序对该文件写的权限。
InternalStorage-2
⏹向应用对应的InternalStorage里面写入数据,这里以写对象来示例,如下:
FileOutputStreamfout=null;
ObjectOutputStreamos=null;
try{
fout=
HelloWorldActivity.this.openFileOutput("
MyData.txt"
Activity.MODE_PRIV
ATE);
os=newObjectOutputStream(fout);
os.writeObject(list);
}catch(Exceptionerr){err.printStackTrace();
}
finally{
try{fout.close();
}catch(IOExceptione1){e1.printStackTrace();
try{os.close();
}catch(IOExceptione){e.printStackTrace();
⏹不支持BufferedOutputStream
InternalStorage-3
⏹读取应用对应的InternalStorage里面的数据,这里以读取对象来示例,如下:
FileInputStreamfin=null;
ObjectInputStreamos=null;
fin=HelloWorldActivity.this.openFileInput("
os=newObjectInputStream(fin);
Toast.makeText(HelloWorldActivity.this,"
readfile="
+os.readObject(),
Toast.LENGTH_LONG).show();
}catch(Exceptionerr){
err.printStackTrace();
}finally{
try{fin.close();
try{os.close();
}catch(IOExceptione){e.printStackTrace();
⏹同样不支持BufferedInputStream
InternalStorage-保存Cache文件
⏹如果你希望保存一些Cache数据,你可以使用getCacheDir()来打开文件,将会
把数据存储到一个临时的Cache文件里面。
⏹当设备的内部存储空间低的时候,Android系统可能会清除这些Cache文件,以回
收存储空间,这也意味着,你不能在Cache文件里面存储需要持久化的数据。
InternalStorage-其它常用方法
⏹在Context中其他常用的方法:
getFilesDir()
得到内部存储的文件系统的绝对路径
getDir()
在内部存储中创建目录,如果存在的话就打开这个目录
deleteFile()
删除文件
fileList()
返回当前应用存储的文件列表
ExternalStorage(操作SD卡)-1
⏹Android的I/O基本上和Java的I/O是一样的,只有一点点不同的地方,比如:
需要加入sdcard的操作权限
需要判断sd卡是否存在,存在才能操作
放在sdcard的文件是公共的,而放到自己应用目录里面的文件才是私有的
⏹常用的功能
在AndroidManifest.xml添加sdcard读写操作权限
<
uses-permissionandroid:
name="
android.permission.WRITE_EXTERNAL_STORAGE"
>
/uses-permission>
在AndroidManifest.xml添加能创建和删除sdcard文件的操作权限
android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/>
判断SD卡是否插入
Environment.getExternalStorageState().equals(android.os.Enviroment.MEDIA_MOUNTED)
获得SD卡根目录
Android7及以下版本,使用:
Environment.getExternalStorageDirectory()可以获得如下路径
“/Android/data/<
package_name>
/files/”
Android8及以上版本,建议使用:
Context的getExternalFilesDir(type)方法,type表示你想要访问什么样
的子目录,比如Environment.DIRECTORY_MUSIC,如果访问根目录,就传入null。
ExternalStorage(操作SD卡)-2
⏹从SD卡上读文件,基本就是Java里面I/O的操作,这里以读对象为例:
publicObjectreadFile(StringfilePathName){
Objectret=null;
FileInputStreamfins=null;
try{
Filefile=newFile(Environment.getExternalStorageDirectory()+filePathName);
fins=newFileInputStream(file);
os=newObjectInputStream(fins);
ret=os.readObject();
}catch(Exceptionerr){err.printStackTrace();
try{fins.close();
returnret;
⏹比较遗憾的是,目前加上BufferedInputStream就出错
ExternalStorage(操作SD卡)-3
⏹向SD卡上写文件,基本就是Java里面I/O的操作,这里以写对象为例:
publicvoidwritefile(StringfilePathName,Objectobj){
FileOutputStreamfouts=null;
Filefile=newFile(Environment.getExternalStorageDirectory()+filePathName);
if(file.getParentFile().isDirectory()&
&
!
file.getParentFile().exists()){
file.getParentFile().mkdirs();
if(!
file.exists()){file.createNewFile();
}
fouts=newFileOutputStream(file);
os=newObjectOutputStream(fouts);
os.writeObject(obj);
}catch(Exceptionerr){err.printStackTrace();
try{fouts.close();
⏹如果要保存成Cache文件,可以使用Context的getExternalCacheDir方法
二、数据存取方式
⏹Preference
–“键-值”方式存储,以xml文件的形式保存
⏹File
–采用java.io.*库所提供I/O接口读写文件
⏹SQLite
–SQLite是轻量级的嵌入式数据库引擎
⏹ContentProvider
–用于实现不同应用程序之间的数据共享
1、Preference
⏹主要用于存储数据较少的场合,比如配置信息
⏹文件位置:
/data/data/<
包>
/shared_prefs/***.xml
⏹需要用到接口:
SharedPreferences
⏹及其内部接口:
SharedPreferences.Editor
⏹取得接口:
⏹Context.SharedPreferences(filename,mode)
⏹SharedPreferences.edit()
⏹数据类型、数据操作:
⏹int、flaot、string、boolean等
⏹putString(key,value)
⏹getString(key,defValue)
实例:
Test_of_Preference
⏹定义main.xml:
⏹一个EditText用于键入数据
⏹三个Button分别用于将数据写入xml文件、从文件获取数据并显示、清除文件中的数据
⏹定义sharedpreferences.xml:
⏹一个TextView用于显示从文件中获取的数据
textView1=(TextView)findViewById(R.id.textView1);
⏹创建接口sp1、spEditor1
privateSharedPreferencessp1;
sp1=this.getSharedPreferences("
test"
MODE_PRIVATE);
SharedPreferences.EditorspEditor1=sp1.edit();
⏹以键值<
StringKey,StringValue>
方式加入数据
spEditor1.putString("
TEXT"
et1.getText().toString());
spEmit();
⏹以StringKey为索引来获取数据
Stringstring1=sp1.getString("
textView1.setText(string1);
⏹清除数据
spEditor1.clear().commit();
运行结果:
可在FileExplorer中查找、导出文件:
data/data/<
/sharedprefs/test.xml
2、File
⏹文件可用来存放大量数据,如文本、图片、音频等
⏹默认位置:
/files/***.***
⏹java.io.*库提供I/O接口实现本地文件读写
⏹文件输入流的获取
⏹Context.openFileInput(Stringname)
⏹文件输出流的获取
⏹Context.openFileOutput(Stringname,
intmode)
⏹包内资源(res/raw/)文件的读取
⏹Resources.openRawResource(R.raw.file)
Test_of_File
⏹两个EditText、两个Button
⏹写文件writeFile(str):
privatevoidwriteFile(Stringstr){
try{
FileOutputStreamoutput=
openFileOutput(FILE_NAME,MODE_APPEND);
output.write(str.getBytes());
output.close();
}catch(Exceptione){
Log.e("
File_IO"
e.toString());
this.finish();
⏹读文件readFile():
privateStringreadFile(){
FileInputStreaminput=openFileInput(FILE_NAME);
byte[]buffer=newbyte[input.available()];
input.read(buffer);
input.close();
Stringstr=newString(buffer);
returnstr;
returnnull;
editText2.setText(readFile());
⏹运行结果:
⏹注意:
写文件时用的MODE_APPEND模式
3、SQLite
⏹轻量级嵌入式数据库引擎,面向资源有限的设备
⏹没有服务器进程
⏹所有数据存放在同一文件中
⏹跨平台,可自由复制
⏹SQLiteOpenHelper
⏹帮助类,用于管理数据库创建和版本更新
⏹onCreate(SQLiteDatabasedb)
⏹onUpgrade(db,intold_ver,intnew_ver)
⏹sqlite3:
位于<
SDK>
/tools
Test_of_SQLite
⏹DatabaseHelper继承自SQLiteOpenHelper
⏹重写了onCreate()、onUpgrade()方法
⏹实现insert、del、query、close等方法
⏹ListView显示记录,字段对应成TextView
⏹ListView的onItemClick()实现删除记录
⏹数据库文件路径:
⏹/data/data/<
/database/***.db
DatabaseHelper.java
privateSQLiteDatabasedb;
publicvoidinsert(ContentValuesvalues){
SQLiteDatabasedb=getWritableDatabase();
db.insert(TABLE_NAME,null,values);
db.close();
publicvoiddel(intid){
if(db==null)db=getWritableDatabase();
db.delete(TABLE_NAME,"
_id=?
newString[]{String.valueOf(id)});
publicvoidonCreate(SQLiteDatabasedb){
this.db=db;
db.execSQL(CREATE_TABLE);
Query_Test.java
DatabaseHelperdbHelper=newDatabaseHelper(this);
Cursorcursor=dbHelper.query();
String[]from={"
_id"
name"
url"
notes"
};
int[]to={R.id.textView1,R.id.textView2,R.id.textView3,
R.id.textView4};
SimpleCursorAdapterscadapter=newSimpleCursorAdapter
(this,R.layout.favoritelist,cursor,from,to);
ListViewlistView=getListView();
listView.setAdapter(scadapter);
AlertDialog.BuilderadBuilder=newAlertDialog.Builder(this);
listView.onItemClick{
adBuilder.setMessage("
确认删除?
)
.setPositiveButton("
Y"
newOnClickListener())
.setNegativeButton("
N"
newOnClickListener());
AlertDialogaleraDialog=adBuilder.create();
aleraDialog.show();
4、ContentProvider
⏹与Activity、Service、BroadcastReceiver同属Android应用程序基本组件之一
⏹用于保存和检索数据,实现了数据的跨应用共享
⏹Android中各应用均运行在自己的进程中,互相访问的ContentProvider接口统一定义在android.provider包内,涵盖了常见的数据类型如音视频、图片、联系人等
⏹实现的方法包括:
insert、delete、qurey、update等
⏹URI
–ContentProvider用以实现数据共享的对象
⏹ContentResolver
–ContentProvider的客户端接口
–客户端通过getContentResolver()获得接口
–提供与ContentPro