Andriod数据存储的基本知识.docx
- 文档编号:5729181
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:19
- 大小:128.54KB
Andriod数据存储的基本知识.docx
《Andriod数据存储的基本知识.docx》由会员分享,可在线阅读,更多相关《Andriod数据存储的基本知识.docx(19页珍藏版)》请在冰豆网上搜索。
Andriod数据存储的基本知识
数据存储
Andriod数据存储
成晓萍
2013/3/28
1、
Andriod数据存储的基本知识
2、Andriod数据存储方式
[本文档主要介绍了Andriod数据存储的基本知识和数据存储方式。
]
一、数据存储的基本知识
⏹1、使用SharedPreferences来进行数据的读写
⏹2、使用InternalStorage来进行数据的读写
⏹3、使用ExternalStorage来进行数据的读写
⏹Android系统提供了多种数据存储的方式,如下:
1:
SharedPreferences:
用来存储私有的、原始类型的、简单的数据,通常是Keyvalue对
2:
InternalStorage:
在设备内部存储器中存储数据
3:
ExternalStorage:
在设备的扩展存储上保存数据,通常是SD卡
4:
SQLiteDatabases:
SQLite数据库
5:
NetworkConnection:
存储数据到网络服务器上
使用SharedPreferences-1
⏹SharedPreferences是用来存储一些应用私有的、原始类型的、简单的数据的一
个框架,保存的数据通常是Key-value对
⏹要获得SharedPreferences对象,通常有两种方法:
1:
getSharedPreferences():
如果你想要使用多个preferences文件的话,可以通
过传入一个识别的名称就可以获取到相应的SharedPreferences对象
2:
getPreferences():
如果一个preferences文件仅仅在当前的Activity中使用的
话,你可以使用这个方法,无需要提供识别的名称。
⏹使用SharedPreferences对象来获取数据非常简单,直接使用相应的getter方法
即可
⏹使用SharedPreferences对象来存储数据,大致有如下几步
1:
调用edit()方法来得到SharedPreferences.Editor
2:
调用相应的put方法值添加进去
3:
调用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对象的时候,需要指定文件创建的模式:
1:
MODE_PRIVATE:
默认模式,文件只可以被调用该方法的应用程序访问
2:
MODE_WORLD_READABLE:
赋予所有的应用程序都可以读取该文件
3:
MODE_WORLD_WRITEABLE:
赋予所有的应用程序都可以写该文件
4:
MODE_MULTI_PROCESS:
SharedPreference的装载标记,设置它,文件将会在
SharedPreference实例被装载到进程的时候检查是否被修改,主要用在一个应用
有多个进程的情况。
使用SharedPreferences-3
⏹从SharedPreferences对象读取数据
SharedPreferencessp=
T2.this.getSharedPreferences("SP",Activity.MODE_PRIVATE);
Stringp1=sp.getString("param1","");
intp2=sp.getInt("param2",0);
⏹SharedPreferences的数据以xml存储在data/data/包名/shared_prefs下面
InternalStorage-1
⏹当应用程序被安装到系统中后,其所在的包会有一个文件夹用于存放自己的数
据,只有这个应用程序才有对这个文件夹的写入权限,这个私有的文件夹位于
Android系统的/data/data/<应用程序包名>目录下,其他的应用程序都无法向这
个文件夹中写入数据。
⏹要读取应用自己的私有文件,就不能直接使用JavaI/O的API了,需要使用
Activity提供的方法:
openFileInput或openFileOutput。
⏹在使用openFileOutput方法的时候,需要指定打开的模式:
1:
MODE_PRIVATE:
默认模式,文件只可以被调用该方法的应用程序访问
2:
MODE_APPEND:
如果文件已存在就向该文件的末尾继续写入数据,而不是覆盖原
来的数据。
3:
MODE_WORLD_READABLE:
赋予所有的应用程序对该文件读的权限。
4:
MODE_WORLD_WRITEABLE:
赋予所有的应用程序对该文件写的权限。
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;
try{
fin=HelloWorldActivity.this.openFileInput("MyData.txt");
os=newObjectInputStream(fin);
Toast.makeText(HelloWorldActivity.this,"readfile="+os.readObject(),
Toast.LENGTH_LONG).show();
}catch(Exceptionerr){
err.printStackTrace();
}finally{
try{fin.close();}catch(IOExceptione1){e1.printStackTrace();}
try{os.close();}catch(IOExceptione){e.printStackTrace();}
}
⏹同样不支持BufferedInputStream
InternalStorage-保存Cache文件
⏹如果你希望保存一些Cache数据,你可以使用getCacheDir()来打开文件,将会
把数据存储到一个临时的Cache文件里面。
⏹当设备的内部存储空间低的时候,Android系统可能会清除这些Cache文件,以回
收存储空间,这也意味着,你不能在Cache文件里面存储需要持久化的数据。
InternalStorage-其它常用方法
⏹在Context中其他常用的方法:
1:
getFilesDir()
得到内部存储的文件系统的绝对路径
2:
getDir()
在内部存储中创建目录,如果存在的话就打开这个目录
3:
deleteFile()
删除文件
4:
fileList()
返回当前应用存储的文件列表
ExternalStorage(操作SD卡)-1
⏹Android的I/O基本上和Java的I/O是一样的,只有一点点不同的地方,比如:
1:
需要加入sdcard的操作权限
2:
需要判断sd卡是否存在,存在才能操作
3:
放在sdcard的文件是公共的,而放到自己应用目录里面的文件才是私有的
⏹常用的功能
1:
在AndroidManifest.xml添加sdcard读写操作权限
name="android.permission.WRITE_EXTERNAL_STORAGE"> 2: 在AndroidManifest.xml添加能创建和删除sdcard文件的操作权限 name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 3: 判断SD卡是否插入 Environment.getExternalStorageState().equals(android.os.Enviroment.MEDIA_MOUNTED) 4: 获得SD卡根目录 Android7及以下版本,使用: Environment.getExternalStorageDirectory()可以获得如下路径 “/Android/data/ Android8及以上版本,建议使用: Context的getExternalFilesDir(type)方法,type表示你想要访问什么样 的子目录,比如Environment.DIRECTORY_MUSIC,如果访问根目录,就传入null。 ExternalStorage(操作SD卡)-2 ⏹从SD卡上读文件,基本就是Java里面I/O的操作,这里以读对象为例: publicObjectreadFile(StringfilePathName){ Objectret=null; FileInputStreamfins=null; ObjectInputStreamos=null; try{ Filefile=newFile(Environment.getExternalStorageDirectory()+filePathName); fins=newFileInputStream(file); os=newObjectInputStream(fins); ret=os.readObject(); }catch(Exceptionerr){err.printStackTrace();}finally{ try{fins.close();}catch(IOExceptione){e.printStackTrace();} try{os.close();}catch(IOExceptione){e.printStackTrace();} } returnret; } ⏹比较遗憾的是,目前加上BufferedInputStream就出错 ExternalStorage(操作SD卡)-3 ⏹向SD卡上写文件,基本就是Java里面I/O的操作,这里以写对象为例: publicvoidwritefile(StringfilePathName,Objectobj){ FileOutputStreamfouts=null; ObjectOutputStreamos=null; try{ 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(); }finally{ try{fouts.close();}catch(IOExceptione){e.printStackTrace();} try{os.close();}catch(IOExceptione){e.printStackTrace();} } } ⏹如果要保存成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(); ⏹以键值 spEditor1.putString("TEXT",et1.getText().toString()); spEmit(); ⏹以StringKey为索引来获取数据 Stringstring1=sp1.getString("TEXT",""); textView1.setText(string1); ⏹清除数据 spEditor1.clear().commit(); 运行结果: 可在FileExplorer中查找、导出文件: data/data/<包>/sharedprefs/test.xml 2、File ⏹文件可用来存放大量数据,如文本、图片、音频等 ⏹默认位置: /data/data/<包>/files/***.*** ⏹java.io.*库提供I/O接口实现本地文件读写 ⏹文件输入流的获取 ⏹Context.openFileInput(Stringname) ⏹文件输出流的获取 ⏹Context.openFileOutput(Stringname, intmode) ⏹包内资源(res/raw/)文件的读取 ⏹Resources.openRawResource(R.raw.file) 实例: Test_of_File ⏹定义main.xml: ⏹两个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(){ try{ FileInputStreaminput=openFileInput(FILE_NAME); byte[]buffer=newbyte[input.available()]; input.read(buffer); input.close(); Stringstr=newString(buffer); returnstr; }catch(Exceptione){ Log.e("File_IO",e.toString()); this.finish();} returnnull; } editText2.setText(readFile()); ⏹运行结果: ⏹注意: 写文件时用的MODE_APPEND模式 3、SQLite ⏹SQLite ⏹轻量级嵌入式数据库引擎,面向资源有限的设备 ⏹没有服务器进程 ⏹所有数据存放在同一文件中 ⏹跨平台,可自由复制 ⏹SQLiteOpenHelper ⏹帮助类,用于管理数据库创建和版本更新 ⏹onCreate(SQLiteDatabasedb) ⏹onUpgrade(db,intold_ver,intnew_ver) ⏹sqlite3: 位于 实例: 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Andriod 数据 存储 基本知识