Android(安卓)数据保存
16lz
2021-12-04
Android数据保存方法
android数据保存主要保存以下三种: 1、共享参数文件中保存简单的键值对数据; 2、保存任意的文件数据到Android的文件系统中; 3、使用SQLite数据库管理保存键值集
通过使用SharePreferences API来保存简单的键值对数据。 共享参数文件的获取或创建: 可以通过以下两种方法来获取: getSharedPreferences() 该方法需要提供一个共享参数文件的名称标识,该方法可以在任意Context中调用 getPreferences() 使用该方法主要是为一个activity的私有数据存储使用,该方法不提供文件的名称。 eg: [java] view plain copy- Contextcontext=getActivity();
- SharedPreferencessharedPref=context.getSharedPreferences(getString(R.string.preference_file_key),Context.MODE_PRIVATE);
- SharedPreferencessharedPref=getActivity().getPreferences(Context.MODE_PRIVATE);
向共享参数文件中写入数据
通过调用SharedPreferecnes的edit()方法创建一个SharedPreferebces.Editor。 通过其putInt()、putString()等方法来写入相应的键值数据,并通过调用commit()来保存数据。 eg: [java] view plain copy- SharedPreferencessharedPref=getActivity().getPreferences(Context.MODE_PRIVATE);
- SharedPreferences.Editoreidtor=sharedPref.edit();
- editor.putInt(getString(R.string.save_high_score),newHighScore);
- editor.commit();
从共享参数文件中读取数据
通过调用getInt()、getString()方法来从共享参数文件中获取对应的值,并且可以提供一个默认的值,如果在共享参数文件中不存在该键值时,就使用默认值。 eg. [java] view plain copy- SharedPreferencessharedPref=getActivity().getPreferences(Context.MODE_PRIVATE);
- intdefaultValue=getResources().getInteger(R.string.saved_high_score_default);
- longhighScore=sharedPref.getInt(getString(R.sting.saved_high_score),defaultValue);
将数据保存于文件中
android 设备都包括两个存储区域,内部和外部存储。 内部存储为默认的存储设备,如果希望数据为app私有(不被用户和其他app程序访问),则应将数据保存到内部存储设备上。 如果对存储数据没有访问限制,并且希望和其他APP或者用户访问,外部存储设备为最佳存储。获取外部存储设备的访问许可
为了将数据保存到外部存储设备,必须在mainifest文件中请求WRITE_EXTERNAL_STORAGE权限: [html] view plain copy- <mainifets...>
- <uses-permissionandroid:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>
- </manifest>
- <manifest...>
- <uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
- ...
- </manifest>
将文件保存到内部存储器
可以通过以下两种方法获取文件或者文件目录: getFilesDir() 返回一个内部存储器上的文件夹 getCacheDir() 返回一个给当前app的内部存储器上的临时缓存文件,当在不需要使用该文件时,必须删除该文件,并且应指定一个合适的内存大小限制,比如1MB,如果系统开始运行缓慢,则会无警告的删除这些缓存文件。 可以通过上面的方法获取的文件夹在内部存储器上创建一个新的文件: [java] view plain copy- Filefile=newFile(context.getFilesDir(),filename);
- Stringfilename="myfile";
- Stringstring="Helloworld!";
- FileOutPutStreamoutputStream;
- try{
- outputStream=openFileOutput(filename,Context.MODE_PRIVATE);
- outputStream.write(string.getBytes());
- outputStream.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- publicFilegetTempFile(Contextcontext,Stringurl){
- Filefile;
- try{
- Stringfilename=Uril.parse(url).getLastPathSegment();
- file=File.createTempFile(filename,null,context.getCacheDir());
- }catch(IOExceptione){
- //
- }
- returnfile;
- }
将文件保存到外部存储器
在将文件写到外部存储器上之前,必须先检查外部存储器是否可用。通过调用方法getExternalStorageState()方法来查询外部存储器的状态,如果返回的状态为MEDIAZ_MOUNTED,则此时你可以在外部存储器上读写文件。 eg. [java] view plain copy- //该方法判断外部存储器是否挂载上(是否可读写)。
- publicbooleanisExternalStorageWritable(){
- Stringstate=Environment.getExternalStorageState();
- if(Environment.MEDIA_MOUNTED.equals(state)){
- returentrue;
- }
- returnfalse;
- }
- //检查外部存储器是否至少为可读的
- publicbooleanisExternalStorageReadable(){
- Stringstate=Environment.getExternalStorageState();
- if(Environment.MEDIA_MOUNTED.equals(state)||
- Environment.MEIDA_MOUNTED_READ_ONLY.equals(state)){
- returentrue;
- }
- returnfalse;
- }
- //该方法获取用户的公共图片文件夹文件
- publicFilegetAlbumStorageDir(StringalbumName){
- Filefile=newFile(Environment.getExternalStoragePublicDirectory(Evironment.DIRECTORY_PICTURES),albumName);
- if(!file.mkdirs()){
- Log.e(LOG_TAG,"Directorynotcreated");
- }
- returnfile;
- }
- publicFilegetAlbumStorageDir(Contextcontext,StringalbumName){
- //Getthedirectoryfortheapp'sprivatepicturesdirectory.
- Filefile=newFile(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES),albumName);
- if(!file.mkdirs()){
- Log.e(LOG_TAG,"Directorynotcreated");
- }
- returnfile;
- }
查询剩余空间
调用方法getFreeSpace() 和getTaotalSpace().这两个方法分别查询当前存储盘的可用空间和总容量。 我们没必要在写文件之前去检查存储盘的可用空间,我们可以通过对catch IOException 进行分析。文件的删除
如果要删除一个文件,这可以直接调用delete()方法来删除。 eg. myFile.delete(); 如果要删除的文件为内部存储器上的文件,则也可以调用Context的deleteFile()方法去删除该文件 eg: [java] view plain copy- myContext.deleteFile(fileName);
将数据保存到SQL数据库中
定义数据库表结构
这里通过JAVA类定义了一个数据表的结构 [java] view plain copy- publicfinalclassFeedReaderContract{
- publicFeedReaderContract(){}
- //内部类定义表结构
- publicstaticabstractclassFeedEntryimplementsBaseColumns{
- publicstaticfinalStringTABLE_NAME="entry";
- publicstaticfinalStringCOLUMN_NAME_ENTRY_ID="entryid";
- publicstaticfinalStringCOLUMN_NAME_TITLE="title";
- publicstaticfinalStringCOLUMN_NAME_SUBTITLE="subtitle";
- ...
- }
- }
使用SQL Helper 来创建一个数据库:[java] view plain copy
- privatestaticfinalStringTEXT_TYPE="TEXT";
- privatestaticfinalStringCOMMA_SEP=",";
- privatestaticfinalStringSQL_CREATE_ENTRIES=
- "CREATETABLE"+FeedEntry.TABLE_NAME+"("+
- FeedEntry._ID+"INTEGERPRIMARYKEY,"+
- FeedEntry.COLUMN_NAME_ENTRY_ID+TEXT_TYPE+COMMA_SEP+
- FeedEntry.COLUMN_NAME_TITLE+TEXT_TYPE+COMMA_SEP+
- ...//AnyotheroptionsfortheCREATEcommand
- ")";
- privatestaticfinalStringSQL_DELETE_ENTRIES=
- "DROPTABLEIFEXISTS"+FeedEntry.TABLE_NAME;
android将数据保存到程序的私有磁盘空间中,通常这里保存的数据不能被其他应用程序访问
要使用SQLiteOpenHelper类,需要实现其子类,该子类覆盖了onCreate(),onUpgrade(),onOpen()方法,你也可以。[java] view plain copy
- publicclassFeedReaderDbHelperextendsSQLiteOpenHelper{
- //Ifyouchangethedatabaseschema,youmustincrementthedatabaseversion.
- publicstaticfinalintDATABASE_VERSION=1;
- publicstaticfinalStringDATABASE_NAME="FeedReader.db";
- publicFeedReaderDbHelper(Contextcontext){
- super(context,DATABASE_NAME,null,DATABASE_VERSION);
- }
- publicvoidonCreate(SQLiteDatabasedb){
- db.execSQL(SQL_CREATE_ENTRIES);
- }
- publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
- //Thisdatabaseisonlyacacheforonlinedata,soitsupgradepolicyis
- //tosimplytodiscardthedataandstartover
- db.execSQL(SQL_DELETE_ENTRIES);
- onCreate(db);
- }
- publicvoidonDowngrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
- onUpgrade(db,oldVersion,newVersion);
- }
- }
使用我们自定已的SQLiteOpenHelper类[java] view plain copy
- FeedReaderDbHelpermDbHelper=newFeedReaderDbHelper(getContext());
向数据库中插入数据
通过使用ContentValues的instert()方法将数据插入到数据库中 [java] view plain copy- SQLiteDatabasedb=mDbHelper.getWritableDatabase();
- ContentValuesvalues=newContentValues();
- values.put(FeedEntry.COLUMN_NAME_ENTRY_ID,id)
- values.put(FeedEntry.COLUMN_NAME_TITLE,title);
- values.put(FeedEntry.COLUMN_NAME_CONTENT,content);
- longnewRowId;
- newRowId=db.insert(FeedEntry.TABLE_NAME,
- FeedEntry.COLUMN_NAME_NULLABLE,
- values);
从数据库中读取数据
要从数据库中读取数据,使用query方法 [java] view plain copy- SQLiteDatabasedb=mDbHelper.getReadableDatabase();
- //Defineaprojectionthatspecifieswhichcolumnsfromthedatabase
- //youwillactuallyuseafterthisquery.
- String[]projection={
- FeedEntry._ID,
- FeedEntry.COLUMN_NAME_TITLE,
- FeedEntry.COLUMN_NAME_UPDATED,
- ...
- };
- //HowyouwanttheresultssortedintheresultingCursor
- StringsortOrder=FeedEntry.COLUMN_NAME_UPDATED+"DESC";
- Cursorc=db.query(
- FeedEntry.TABLE_NAME,//Thetabletoquery
- projection,//Thecolumnstoreturn
- selection,//ThecolumnsfortheWHEREclause
- selectionArgs,//ThevaluesfortheWHEREclause
- null,//don'tgrouptherows
- null,//don'tfilterbyrowgroups
- sortOrder//Thesortorder
- );
- <h2><aname="t14"></a>读取Cursor中的数据</h2>cursor.moveToFirst();
- longitemId=cursor.getLong(
- cursor.getColumnIndexOrThrow(FeedEntry._ID)
- );
删除数据库中的数据
[java] view plain copy- Stringselection=FeedEntry.COLUMN_NAME_ENTRY_ID+"LIKE?";
- String[]selectionArgs={String.valueOf(rowId)};
- db.delete(table_name,selection,selectionArgs);
更新数据库数据
[java] view plain copy- SQLiteDatabasedb=mDbHelper.getReadableDatabase();
- ContentValuesvalues=newContentValues();
- values.put(FeedEntry.COLUMN_NAME_TITLE,title);
- Stringselection=FeedEntry.COLUMN_NAME_ENTRY_ID+"LIKE?";
- String[]selectionArgs={String.valueOf(rowId)};
- intcount=db.update(
- FeedReaderDbHelper.FeedEntry.TABLE_NAME,
- values,
- selection,
- selectionArgs);
更多相关文章
- Unity与Android交互
- android保存文件到手机内存
- 【Android每周专题】触摸屏手势
- Android(安卓)TextView 中如何使用第三方字体
- 短视频直播源码Android关于分屏的知识总结
- Android(安卓)Binder
- 安卓布局文件中控件的各种属性的含义
- Windows平台下搭建Android原生C/C++开发环境
- Android(安卓)进阶之 Android消息机制Handler