关闭

Android入门之数据存储那么几种方式

标签: 数据存储AndroidSharedPreferencesSD卡内部存储器
673人阅读 评论(0) 收藏 举报
分类:

在实际的开发中,Android提供了5种数据存储的方式:

1)文件存储数据

2)使用SharedPreferences存储数据

3)使用SQLite数据库存储数据

4)使用ContentProvide存储数据

5)网络存储数据

 

一、文件存储数据到内部存储器

1)为了保存文本到文件中,需要FileOutputStream类,openFileOutput方法用指定的模式打开一个指定的文件夹来写入:

FileOutputStream fileOut = openFileOutput(“hello.txt”, Context.MODE_WORLD_WRITEABLE);

其中,有三种模式提供选择:

Context.MODE_PRIVATE: 创建的文件只能被该应用程序读写

Context.MODE_WORLD_READABLE:允许其他应用程序读取文件

Context.MODE_WORLD_WRITEABLE: 允许其他应用程序修改文件


2)为了将字符流转换为字节流,需要OutputStreamWriter类的对象,并传入FileOutputStream类的实例作为参数:

OutputStreamWriter osw = newOutputStreamWriter(fileOut);


3)而读取文件则需要用到FileInputStream类和InputStreamReader类:

FileInputStream fileInput = openFileInput(“hello.txt”);

InputStreamReader isr = new InputStreamReader(fileInput);


4)新建一个字符数组作为缓冲器,把文件内容读到缓冲器中,然后将其复制到String对象中

char[] inputBuffer = new char[READ_BLOCK_SIZE];

String s = “”;

int charRead;

while((charRead = isr.read(inputBuffer)>0){

       StringreadString = String.copyValueOf(inputBuffer, 0, charRead);

s +=readString;

inputBuffer= new char[READ_BLOCK_SIZE];

}

public class FilesActivity extends Activity {
	EditText textBox;
	static final int READ_BLOCK_SIZE = 100;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.textBox = (EditText)findViewById(R.id.txtText);
	}
	
	public void onClickSave(View v){
		String str = textBox.getText().toString();
		try {
			FileOutputStream fileOut = openFileOutput("hello.txt", MODE_WORLD_READABLE);
			OutputStreamWriter osw = new OutputStreamWriter(fileOut);			
			osw.write(str);
			osw.flush();
			osw.close();
			Toast.makeText(getBaseContext(), "File saved successfully!", 
					Toast.LENGTH_SHORT).show();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public void onClickLoad(View v){	
		try {
			FileInputStream fileInput = openFileInput("hello.txt");
			InputStreamReader isr = new InputStreamReader(fileInput);
			
			char[] inputBuffer = new char[READ_BLOCK_SIZE];
			String s = "";
			
			int charRead;
			while((charRead = isr.read(inputBuffer)) > 0){
				String readString = String.copyValueOf(inputBuffer, 0, charRead);
				s += readString;
				inputBuffer = new char[READ_BLOCK_SIZE];
			}
			textBox.setText(s);
			Toast.makeText(getBaseContext(), "File loaded successfully", 
					Toast.LENGTH_SHORT).show();			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}

二、文件存储数据到SD卡

返回sd卡的完整路径:

File sdCard = Environment.getExternalStorageDirectory();

在SD卡中创建一个名问MyFiles的目录,最终文件将会保存到这里:

File directory = new File(sdCard.getAbsolutePath()+"/MyFiles");

directory.mkdir();

读取SD卡需要在AndroidMinifest.xml文件中添加权限:

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

</uses-permission>

其他的跟上面的一样,下面看代码:

 

public class FilesActivity extends Activity {
	EditText textBox;
	static final int READ_BLOCK_SIZE = 100;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.textBox = (EditText)findViewById(R.id.txtText);
	}
	
	public void onClickSave(View v){
		String str = textBox.getText().toString();
		try {
			File sdCard = Environment.getExternalStorageDirectory();//返回sd卡的路径
			File directory = new File(sdCard.getAbsolutePath()+"/MyFiles");
			directory.mkdir();
			File file = new File(directory, "textfile.txt");
			FileOutputStream fileOut = new FileOutputStream(file);
			OutputStreamWriter osw = new OutputStreamWriter(fileOut);			
			osw.write(str);
			osw.flush();
			osw.close();
			Toast.makeText(getBaseContext(), "File saved successfully!", 
					Toast.LENGTH_SHORT).show();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	public void onClickLoad(View v){		
		try {
			File sdCard = Environment.getExternalStorageDirectory();
			File directory = new File(sdCard.getAbsolutePath()+"/MyFiles");
			File file = new File(directory, "textfile.txt");
			FileInputStream fileIn;
			fileIn = new FileInputStream(file);
			InputStreamReader isr = new InputStreamReader(fileIn);
			char[] inputBuffer = new char[READ_BLOCK_SIZE];
			String s = "";
			
			int charRead;
			while((charRead = isr.read(inputBuffer)) > 0){
				String readString = String.copyValueOf(inputBuffer, 0, charRead);
				s += readString;
				inputBuffer = new char[READ_BLOCK_SIZE];
			}
			textBox.setText(s);
			Toast.makeText(getBaseContext(), "File loaded successfully", 
					Toast.LENGTH_SHORT).show();	
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
}

二、使用SharedPreferences存储数据

【存】                                                                                    

创建对象:

SharedPreferences sp = getSharedPreferences("FILE_NAME",MODE_PRIVATE);

创建编辑器:

SharedPreferences.Editor editor = sp.edit();

往编辑器存入int、boolean、String等类型的数据分别使用对应的方法:

editor.putBoolean("flag", true);

editor.putInt("age", 40);

editor.putString("你好啊,请多多指教","message");

编辑器必须发送出去才能生效:

editor.commit();

【取】

还是需要SharedPreferences 对象:

SharedPreferences sp =getSharedPreferences("FILE_NAME",MODE_PRIVATE);

与set对应,取出对应的数据是get,如getBoolean、getString等:

booleanflag = sp.getBoolean("flag",false);

int age =sp.getInt("age", 0);

String mess = sp.getString("message","No message");


public class MainActivity extends Activity {
	private Button send,look;
	private EditText input;
	private TextView msg;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.msg = (TextView)findViewById(R.id.msg);		
		this.send = (Button)findViewById(R.id.send);
		this.look = (Button)findViewById(R.id.look);
		this.input = (EditText)findViewById(R.id.input);
		send.setOnClickListener(new View.OnClickListener() {			
			@Override
			public void onClick(View v) {
				SharedPreferences sp = getSharedPreferences("FILE_NAME", MODE_PRIVATE);	
				SharedPreferences.Editor editor = sp.edit();
				editor.putString("message",input.getText().toString());
				editor.commit();
				msg.setText("你有新的消息,请注意查收"); 
			}
		});
		look.setOnClickListener(new View.OnClickListener() {		
			@Override
			public void onClick(View v) {
				SharedPreferences sp = getSharedPreferences("FILE_NAME", MODE_PRIVATE);
				String mess = sp.getString("message", "No message");
				msg.setText(mess);
			}
		});
				
	}
}


三、使用静态资源

也就是使用在res/raw文件夹下的文件。使用Activity类的getResources方法返回一个Resources对象,然后使用其openRawResource方法打开包含在res/raw文件夹下的文件。

public void onClickGetSources(View v){
		InputStream is = getBaseContext().getResources().openRawResource(R.raw.text);
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		String str = null;
		try {
			while((str = br.readLine())!=null){
				Toast.makeText(getBaseContext(), str, Toast.LENGTH_SHORT).show();
			}
			is.close();
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:61840次
    • 积分:822
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:4篇
    • 译文:1篇
    • 评论:22条
    文章分类
    最新评论