jeffrey1995/MyBlog

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

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