学习内容:

Android的数据存储....

1.使用SharedPreferences来保存和读取数据...

2.使用File中的I/O来完成对数据的存储和读取...

  一个应用程序,经常需要与用户之间形成交互...需要保存用户的设置和用户的数据信息...这些都离不开数据的存储...Android的数据采用五种方式来进行存储...在这里就先介绍两种存储方式...

1.使用SharedPreferences存储数据...

  对于软件配置参数的保存,Windows系统采用ini文件来进行保存,java程序中则会使用properties属性文件或者是xml文件来完成数据的存储...而Android平台为我们提供了一个SharedPreferences接口来保存数据信息的,SharedPreferences与我们在JAVA中学习的HashTableZ有点相似,SharedPreferences也是通过保存键值对的形式来完成对数据的保存...但是它仅仅能保存的是基本数据类型的数据,无法像HashTable那样可以保存对象...

具体的实现方式有几个步骤:

i.首先我们需要获取SharedPreferences对象...需要调用getSharedPreferences(String name,int mode)方法来进行获取...String表示的指定文件名称...mode表示数据的操作模式...这个操作模式的含义就是我们保存的数据是允许和其他应用程序形成共享呢?还是仅仅是在自己的应用程序中才能对这个数据进行操作...这个参数系统给了几种特定的模式...

常量 描述
public static final int MODE_PRIVATE 表示创建的文件数据是私有数据,只能在本身的应用程序中进行调用,在这种模式下写入的内容会覆盖掉原来的内容
public static final int MODE_WORLD_READABLE 允许替他文件读取该文件数据
public static final int MODE_WORLD_WRITEABLE 允许其他文件写入数据到该文件
SharedPreferences sp=super.getSharedPreferences("MusicService", MODE_WORLD_READABLE);

ii.由于SharedPreferences本身是不支持对数据进行存储和修改的,只允许获取数据,那么存储和修改数据就需要使用到SharedPreferences.Editor接口...因此第二步就是通过edit方法来获取Editor对象...

SharedPreferences.Editor edit=sp.edit();

iii.接着就是通过put("key","value")方法来进行数据的存储...然后使用commit()方法来提交数据,提交数据的目的就是完成数据的更新...

edit.putString("collage","hinst");
edit.putInt("students",20000);

列举一个例子,记录音乐的播放进度,在下次播放的时候在记录的位置进行播放...通过调用服务的方式来完成....

package com.example.musicsharedpreferences;

import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.widget.Toast; public class Serice extends Service{ private MediaPlayer mp=new MediaPlayer();
@Override
public void onCreate(){
Toast.makeText(getApplicationContext(), "Service is create", Toast.LENGTH_SHORT).show();
mp.create(getApplicationContext(), R.raw.java);//设置播放的音乐的资源位置...
mp.setLooping(true);//是否循环...
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Service is bind", Toast.LENGTH_SHORT).show();
SharedPreferences sp=super.getSharedPreferences("MusicService", MODE_WORLD_READABLE);
mp.seekTo(sp.getInt("Content", 0)); //设置播放的位置为保存的进度...
mp.start();
return null;
}
@Override
public boolean onUnbind(Intent intent){
Toast.makeText(getApplicationContext(), "Service is onBind", Toast.LENGTH_SHORT).show();
SharedPreferences sp=super.getSharedPreferences("MusicService", MODE_WORLD_READABLE);
Toast.makeText(getApplicationContext(), "Context"+mp.getCurrentPosition(), Toast.LENGTH_SHORT).show();
SharedPreferences.Editor edit=sp.edit();//获取Eidtor对象来获取存储修改数据的权限...
edit.putInt("Content", mp.getCurrentPosition());//将进度值进行保存,以键值对的方式...
edit.commit();//提交数据,完成更新操作...
mp.stop();
return false; } }

在主函数中通过绑定服务来完成...

package com.example.musicsharedpreferences;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity implements View.OnClickListener { final ServiceConnection con=new ServiceConnection() {//通过实现这个接口,完成Service的调用... @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub } @Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub }
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.bind).setOnClickListener(this);
findViewById(R.id.unbind).setOnClickListener(this);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
ContentValues cv=new ContentValues();
switch(v.getId()){
case R.id.bind:
Intent intent=new Intent(MainActivity.this,com.example.musicsharedpreferences.Serice.class);
Toast.makeText(getApplicationContext(), "bindService", Toast.LENGTH_SHORT).show();
bindService(intent, con, Context.BIND_AUTO_CREATE);
break;
case R.id.unbind:
Toast.makeText(getApplicationContext(), "unbindService", Toast.LENGTH_SHORT).show();
unbindService(con);
break;
}
} }

  这样就完成了音乐播放进度的保存...将数据以键值对的形式进行临时的保存,然后在通过获取数据完成一些相应的操作...但是SharedPreferences只能保存基本的数据类型..如果想保存更多类型的数据就要使用文件进行保存数据信息...

2.使用File来完成对数据的存储...

  File就可以存储其他类型的数据,File实际上就是通过I/O流的形式对数据进行存储,Android中的文件数据一般保存在手机内存中或者是保存在外部的SD卡中...在这里就不引入什么控件了...就单纯的介绍一下Android中如何使用这种方式来完成数据的存储...有过java基础的基本都知道是怎么回事...

package com.example.filesave;
/*使用File来读取手机内存中的数据
*
*
* */
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Scanner; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu; public class MainActivity extends Activity { private FileOutputStream output;
private FileInputStream input;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
output=super.openFileOutput("data.txt", Activity.MODE_PRIVATE);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintStream print=new PrintStream(output);//将输出流进行封装...
print.println("a");
print.println("b");
print.println("c");
print.close(); try {
input=super.openFileInput("data.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Scanner scan=new Scanner(input);
while(scan.hasNext()){
System.out.println(scan.next()+"\n");
}
scan.close();
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

这里简单的说一下为什么要将output进行封装,估计大家也知道这么去用,但是却不知道为什么要这么去用,这里将output进行封装的目的是通过封装这个对象,我们就可以在这个新的类中去调用原来这个类里的内部方法,我们可以把被封装对象的方法进行重写,然后按照我们重写的这种方法来实现某种功能...就是我们可以在这个装饰类内去调用被装饰类的方法..这里通过将output进行封装,然后通过重写方法,最后使用println()的形式来完成了数据的输出...相比output里的输出方法就方便了很多...这个装饰者模式说白了就是装饰类可以调用被装饰类里的方法,不仅可以调用,甚至是可以重写...这样就完成了方法的调包....

  使用File读取内存卡中的数据...

  内存卡的使用目的是为了节省手机内存的空间,将大型的数据信息保存在内存卡中,以保证手机的运行速度更快...那么如何读取内存卡中的数据呢?这个也是非常的简单的...唯一的需要就是要对内存卡是否存在进行具体判断...然后设置相应的读写权限就可以完成在内存卡上进行存取数据的操作...

package com.example.filesave;
/*使用File来读取手机内存中的数据和内存卡中的数据信息...
*
*
* */
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Scanner; import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity { private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView) findViewById(R.id.show);
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File file =new File(Environment.getExternalStorageDirectory().toString()+File.separator+"hinst"+File.separator+"hinst.txt");
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
PrintStream print=null;
try {
print=new PrintStream(new FileOutputStream(file,true));
print.println("山东理工,计算机学院,计科1304");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(print!=null){
print.close();
}else{
Toast.makeText(getApplicationContext(), "内存卡不存在", Toast.LENGTH_SHORT).show();
}
} }
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File file=new File(Environment.getExternalStorageDirectory().toString()+File.separator+"hnist"+File.separator+"hnist.txt");
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
Scanner scan=null;
try {
scan=new Scanner(new FileInputStream(file));
while(scan.hasNext()){
tv.setText(scan.hasNext()+"\n");
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(scan!=null){
scan.close();
}else{
Toast.makeText(getApplicationContext(), "sd卡不存在...", Toast.LENGTH_SHORT).show();
}
} } } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

以上代码就完成了sd卡内部数据的写入和读出...还需要设置的权限就是在AndroidManifest.xml文件内部进行权限设置...

 <uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

这样就完成了在sd卡实现数据的存储....

 

Android 学习笔记之数据存储SharePreferenced+File的更多相关文章

  1. android菜鸟学习笔记18----Android数据存储(二)SharedPreferences

    数据存储的方式,有比直接文件读写更加简便的方式,那就是操作SharedPreferences. SharedPreferences一般用于存储用户的偏好设定,暂时不支持多进程操作. SharedPre ...

  2. Android开发笔记之: 数据存储方式详解

    无论是神马平台,神马开发环境,神马软件程序,数据都是核心.对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用.总体的来讲,数据存储方式有三种:一个是文件,一个是数 ...

  3. MySQL学习笔记之数据存储类型

    说明:本文是作者对MySQL数据库数据存储类型的小小总结. Numeric Type (数字类型) 1.TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT主要根据存储字节长度不 ...

  4. android菜鸟学习笔记20----Android数据存储(四))Android数据库操作

    Android内置了一个名为SQLite的关系型数据库,这是一款轻量型的数据库,操作十分简便.SQLite与别的数据库不同的是,它没有数据类型.可以保存任何类型的数据到你所想要保存的任何表的任何列中. ...

  5. android菜鸟学习笔记17----Android数据存储(一)文件读写

    假如有如下需求,要求能够记录用户输入的用户名和密码,下次登录时,能直接获取之前保存的用户名密码,并在相应的EditText中显示. 要保存用户输入的数据,最先想到的应该就是文件读写了. 通过对andr ...

  6. Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类

    FileService.java也就是操作sdcard的工具类: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  7. android菜鸟学习笔记19----Android数据存储(三)XML文件的解析及序列化

    Android内置了PULL解析器的XPP3实现,以及SAX解析器等,可以直接使用PULL或SAX解析XML,直接把JAVA中进行PULL或SAX解析的代码直接拿来用,遗忘的话,可以参考java拾遗1 ...

  8. android学习日记13--数据存储之File存储

    4.文件存储File File即传统的I/O 流存储文件,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的 ...

  9. Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)

    知识点: 1.使用SQL Helper创建数据库 2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识: 上篇文章学习了保存文件,今天学习的是保存数据到SQL数据库中 ...

随机推荐

  1. ACPI I/O resource conflict with SMBus

    ACPI I/O resource conflict with SMBus 以電子郵件傳送這篇文章BlogThis!分享至 Twitter分享至 Facebook分享到 Pinterest 這幾天遇到 ...

  2. 报错:ASP.NET Web API中找不到与请求匹配的HTTP资源

    当发出GET请求: GET http://localhost:54176/api/Products 报如下错: {  "message": "找不到与请求 URI“htt ...

  3. Swift入门篇-字符串和字符

    今天主要是介绍一下字符串的用法 ,字符串的语法和object-c语法不太一样,但是思想是一样,就是写法不太一样.如果您对.net和java语法比较熟悉的话,那您几乎没有深压力.如果您对swift 基本 ...

  4. JavaScript过滤除连续的数字

    if (!Array.prototype.forEach) { Array.prototype.forEach = function (callback, thisArg) { var T, k; i ...

  5. Dell U2913WM使用感受

    21:9比例,本来想代替双屏的,一周用下来还是不适应,如何能弯成曲面就爽了.感觉最舒服的还是以前19寸5:4双屏,点距大. 还尝试在旁边立个23寸,看了15分钟就受不了,头晕. 漏光,还行. 加了个A ...

  6. Scala 深入浅出实战经典 第41讲:List继承体系实现内幕和方法操作源码揭秘

    Scala 深入浅出实战经典 第41讲:List继承体系实现内幕和方法操作源码揭秘 package com.parllay.scala.dataset /** * Created by richard ...

  7. windbg-bp、 bm、 bu、 bl、 bc、 ba(断点、硬件断点)

    bp bp 命令是在某个地址下断点, 可以 bp 0x7783FEB 也可以 bp MyApp!SomeFunction . 对于后者,WinDBG 会自动找到MyApp!SomeFunction 对 ...

  8. 怎样用UltraISO制作U盘系统安装盘

    http://jingyan.baidu.com/article/d169e186800f02436711d87b.html 如今用u盘装系统成为主流,如何不被社会淘汰.跟我往下边看吧~~ 工具/原料 ...

  9. redmine v3.02版的安装问题

    redmine v3.0.2版的安装问题 参考上次在朋友公司的云主机上安装的过程: 1. 下载 2. gem install bundler 3. bundle install 出现 rmagick ...

  10. C#中yield return用法分析

    这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下. 本文 ...