美文网首页
Android-三种数据储存方式

Android-三种数据储存方式

作者: Jeffrey599 | 来源:发表于2018-05-23 21:22 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:Android-三种数据储存方式

          本文链接:https://www.haomeiwen.com/subject/mkpdjftx.html