一.SharedPreferences类数据存储:
SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:
(1)根据Context获取SharedPreferences对象
(2)利用edit()方法获取Editor对象
(3)通过Editor对象存储key-value键值对数据
(4)通过commit()方法提交数据
示例代码如下:实现简单的登陆界面的记住密码和用户名的功能:
(1)MainActivity.java
package com.example.l0827_sharedpereferences;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
public class MainActivity extends Activity {
private Button btn;
private CheckBox cb;
private EditText et1, et2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1 = (EditText) findViewById(R.id.et1);
et2 = (EditText) findViewById(R.id.et2);
btn=(Button) findViewById(R.id.btn);
cb=(CheckBox) findViewById(R.id.cb);
// 根据Context获取SharedPreferences对象
SharedPreferences sp = MainActivity.this.getSharedPreferences("info", Activity.MODE_PRIVATE);
//设置编辑框的信息
et1.setText(sp.getString("username", ""));
et2.setText(sp.getString("userpassword", ""));
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(cb.isChecked()){
onSave();
onDestroy();
}else{
onDestroy();
}
}
});
}
public void onSave() {
SharedPreferences sp = getSharedPreferences("info", Activity.MODE_PRIVATE);
//利用edit()方法获取Editor对象
SharedPreferences.Editor editor = sp.edit();
//通过Editor对象存储key-value键值对数据
editor.putString("username", et1.getText().toString());
editor.putString("userpassword", et2.getText().toString());
//通过commit()方法提交数据
editor.commit();
}
}
(2)效果图:
初始界面:
输入用户名和密码,但未点击“记住密码”:
点选“记住密码”:
则可以看到data/data/包名/shared_prefs/目录下出现了info.xml文件:
我们把该文件到处,用浏览器打开的效果如下:
由上面的说明可以得出如下结论:
SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。
二.内部存储
内部存储即将数据存在应用程序目录中,这些数据都是应用程序私有的,除了本应用之外的应用程序不能访问,当用户卸载这个应用程序之后这些内部存储的数据也将被删除。路径为“data/data/应用程序包名/”。
用内部方法存储数据的过程:
(1)调用OpenFileOutput方法,传入文件名和操作模式两个参数,返回一个FileOutputStream对象。之后系统会自动的在上面所说的目录下创建一个files目录以存储文件;
(2)write方法向文件中写数据;
(3)close方法关闭流。
参数中常用的模式常数有:
(1)MODE_PRIVATE:创建文件并把数据设为私有;
(2)MODE_APPEND:内容添加模式;
(3)MODE_EORLD_READABLE:全设备可读;
(4)MODE_EORLD_WRETEABLE:全设备可写;(3和4不用,太不安全了)
代码如下:
(1)MainActivity.java
package com.example.l0827_inner;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//文件名
String fileName = "hs";
//文件内容
String content = "HelloWorld";
try {
FileOutputStream fos = openFileOutput(fileName, MODE_PRIVATE);
fos.write(content.getBytes());
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileInputStream fis = openFileInput(fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {
sb.append(line);
}
System.out.println(sb.toString() );
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)效果:
三.外部存储
每一个Android设备都支持一个共享的外部存储空间,其存储的数据是全局可读的,并且可以被用户通过与PC机相连的方式手动修改,所以是很不安全的,系统的配置信息等私有信息是不会存储在外部空间的。
若向外部存储空间存储数据需要用到IO流的操作,也就是以前学习java中的文件的读写问题,除此之外还需要注意的是要增加一个权限:
WRITE_EXTERNAL_STORAGE权限。
示例如下:
(1)MainActivity.java
package com.example.l0827_outer;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建File对象
File file = new File("mnt/sdcard/anjoyo/hs.txt");
if (!file.exists()) {
File f = file.getParentFile();// 返回上一级目录
if (!f.exists()) {
f.mkdir();// 创建目录
}
try {
file.createNewFile();// 创建文件
} catch (IOException e) {
e.printStackTrace();
}
}
// 写入数据
try {
OutputStream os = new FileOutputStream(file);
os.write(new String("Good").getBytes());
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)效果:
四.SQLite数据库存储
(1)MainActivity.java
package com.example.l0827_sqlitedb;
import android.app.ListActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends ListActivity {
private MySQLite sqLite;
private SQLiteDatabase dbWriter;
private SQLiteDatabase dbReader;
private SimpleCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sqLite = new MySQLite(this);
dbWriter = sqLite.getWritableDatabase();// 实现数据库的可写权限
dbReader = sqLite.getReadableDatabase();// 实现数据库的可读权限
// addDB();
// updateDB();
adapter = new SimpleCursorAdapter(this, R.layout.cell, null,
new String[] { "title", "content" }, new int[] { R.id.tv1,
R.id.tv2 });
setListAdapter(adapter);
addDB();
selectDB();
}
public void addDB() {
ContentValues cv = new ContentValues();
cv.put("title", "Helloword111");
cv.put("content", "欢迎大家111");
dbWriter.insert("user", null, cv);// 插入到数据库
}
public void updateDB() {
ContentValues cv = new ContentValues();
cv.put("title", "Hello");
cv.put("content", "大家好");
dbWriter.update("user", cv, "_id=2", null);
}
public void deleteDB() {
dbWriter.delete("user", "_id=4", null);
}
public void selectDB() {
// Cursor
Cursor cursor = dbReader.query("user", null, null, null, null, null,
null);
// 重新适配
adapter.changeCursor(cursor);
while (cursor.moveToNext()) {
System.out
.println(cursor.getString(cursor.getColumnIndex("title")));
System.out.println(cursor.getString(cursor
.getColumnIndex("content")));
}
}
}
(2)MySQLite.java
package com.example.l0827_sqlitedb;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MySQLite extends SQLiteOpenHelper {
public MySQLite(Context context) {
super(context, "hs.db", null, 2);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE user( _id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS user");// 如果数据库存在了这个表,那么删除这个表,重新创建
db.execSQL("CREATE TABLE user( _id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT NOT NULL )");
}
}
转载于:https://blog.51cto.com/wangzhaoli/1283840