Android-三种数据储存方式

整理一下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")),根据列号得到具体值。

这就是三种存储方式的基本使用方法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容