Android-三种数据储存方式
jeffrey1995 opened this issue · 0 comments
整理一下Android开发中的三种基本的数据储存方式,分别是:文件、SharedPreferences、SQLite。
一.文件。
利用Java中的文件输入、输出操作就可以实现,值得注意的是文件存放的路径,内部储存有权限限制,而外部存储一般可以直接进行增删改查操作。
二.SharedPreferences。
这是Android自己提供的一个数据储存方式,简单操作就可以实现快速的数据存储。以key-value的储存形式储存简单的数据(int,string,boolean等)。
使用方法,以我的习惯为例,分三步。
1..统一定义key值常量。
public class ShareContents {
public static final String ShareName = "User_Info";
public static final String isNewPeople = "is_new_people";
//QQ互联相关参数
public static final String openId = "openid";
public static final String access_token = "access_token";
public static final String expires_in = "expires_in";
//QQ帐号信息
public static final String nickname = "nickname";
public static final String head_img = "head_img";
}
2.编写管理类ShareManager.
public class ShareManager {
private String TAG = "ShareManager";
private SharedPreferences share;
private SharedPreferences.Editor editor;
public ShareManager(Context context) {
super();
share = context.getSharedPreferences(ShareContents.ShareName, Context.MODE_PRIVATE);
editor = share.edit();
}
public void clear() {
editor.clear().commit();
}
public String getOpenId() {
return share.getString(ShareContents.openId, null);
}
public void setOpenId(String openId) {
editor.putString(ShareContents.openId, openId).commit();
}
public String getAccess_token() {
return share.getString(ShareContents.access_token, null);
}
public void setAccess_token(String access_token) {
editor.putString(ShareContents.access_token, access_token).commit();
}
public String getExpires_in() {
return share.getString(ShareContents.expires_in, null);
}
public void setExpires_in(String expires_in) {
editor.putString(ShareContents.expires_in, expires_in).commit();
}
public String getNickname() {
return share.getString(ShareContents.nickname, null);
}
public void setNickname(String nickname) {
editor.putString(ShareContents.nickname, nickname).commit();
}
public String getHead_img() {
return share.getString(ShareContents.head_img, null);
}
public void setHead_img(String head_img) {
editor.putString(ShareContents.head_img, head_img).commit();
}
public boolean getIsNewPeople() {
return share.getBoolean(ShareContents.isNewPeople, true);
}
public void setIsNewPople(boolean newPople) {
editor.putBoolean(ShareContents.isNewPeople, newPople).commit();
}
}
share = context.getSharedPreferences(ShareContents.ShareName, Context.MODE_PRIVATE);
实例化一个SharedPreferences对象,参数分别是名字和类型。
share.get+类型用来获取对应值,第一个参数是key,第二个参数是默认值。
share.editor.put+类型用来保存值,第一个参数是key,第二个参数是修改的值。(最后记得commit)
3.实例ShareManager对象,调用相关方法。
三、SQLite
Android支持轻量级关系数据库SQLite。下面是它的一种基本使用方法。
1.自定义SQLiteOpenHelper
public class MyDBHelper extends SQLiteOpenHelper{
private static final String DATABASE_NAME = "forward.db";
private static final int DATABASE_VERSION = 1;
public MyDBHelper(Context context) {
//CursorFactory设置为null,使用默认值
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//数据库第一次被创建时onCreate会被调用
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS forward_history" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT,news_id VARCHAR,title VARCHAR, forward_money VARCHAR,type INTEGER, date VARCHAR)");
}
//如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE forward_history ADD COLUMN other STRING");
}
}
在构造函数中传入数据库的名字和版本。
复写onCreate方法时,会传入一个SQLiteDatabase对象,直接调用execSQL方法执行SQL语句初始化数据库。
复写onUpgrade函数,在版本号不同时调用。
2.编写MyDBManager统一操作。
public class MyDBManager {
private MyDBHelper helper;
private SQLiteDatabase db;
public MyDBManager(Context context) {
helper = new MyDBHelper(context);
//因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);
//所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里
db = helper.getWritableDatabase();
}
/**
* add forwardHistory
*
* @param forwardHistories
*/
public void add(List<ForwardHistory> forwardHistories) {
db.beginTransaction(); //开始事务
try {
for (ForwardHistory fh : forwardHistories) {
ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据
cv.put("news_id",fh.getNews_id());
cv.put("title",fh.getTitle());
cv.put("forward_money",fh.getForward_money());
cv.put("type",fh.getType());
cv.put("date",fh.getDate());
db.insert("forward_history",null,cv);
}
db.setTransactionSuccessful(); //设置事务成功完成
} finally {
db.endTransaction(); //结束事务
}
}
/**
* query all forwardHistory, return list
*
* @return List<ForwardHistory>
*/
public List<ForwardHistory> query() {
ArrayList<ForwardHistory> history_list = new ArrayList<ForwardHistory>();
Cursor c = queryTheCursor();
while (c.moveToNext()) {
ForwardHistory forwardHistory = new ForwardHistory();
forwardHistory.setId(c.getString(c.getColumnIndex("_id")));
forwardHistory.setNews_id(c.getString(c.getColumnIndex("news_id")));
forwardHistory.setTitle(c.getString(c.getColumnIndex("title")));
forwardHistory.setForward_money(c.getString(c.getColumnIndex("forward_money")));
forwardHistory.setType(c.getInt(c.getColumnIndex("type")));
forwardHistory.setDate(c.getString(c.getColumnIndex("date")));
history_list.add(forwardHistory);
}
c.close();
return history_list;
}
/**
* 查询数据库中是否包含相同ID的数据
* @param news_id
* @return
*/
public boolean isExist(String news_id) {
boolean result = false;
Cursor c = queryTheCursor();
while (c.moveToNext()) {
if (c.getString(c.getColumnIndex("news_id")).equals(news_id)) {
result = true;
break;
}
}
c.close();
return result;
}
/**
* query all persons, return cursor
*
* @return Cursor
*/
public Cursor queryTheCursor() {
Cursor c = db.rawQuery("SELECT * FROM forward_history", null);
return c;
}
/**
* 从数据库中移除某条数据
* @param news_id 新闻ID
*/
public void remove(String news_id)
{
db.execSQL("DELETE FROM forward_history where news_id=" + news_id);
}
/**
* close database
*/
public void closeDB() {
db.close();
}
}
helper = new MyDBHelper(context);
db = helper.getWritableDatabase();得到我之前定义好的数据库。接下里就可以自己定义我们对数据库的操作方法了。
例如add方法,开启事务向数据库中插入数据。
ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据
cv.put("news_id",fh.getNews_id());
cv.put("title",fh.getTitle());
cv.put("forward_money",fh.getForward_money());
cv.put("type",fh.getType());
cv.put("date",fh.getDate());
db.insert("forward_history",null,cv);
实例一个ContentValues,将数据放入其中,最后调用insert方法将ContentValues传入即可。
public Cursor queryTheCursor() {
Cursor c = db.rawQuery("SELECT * FROM forward_history", null);
return c;
}
rawQuery方法,返回一个Cursor对象(类似指针),里面包含查询得到的数据。通过c.getString(c.getColumnIndex("_id")),根据列号得到具体值。