数据存储(一)

这段时间在写自己的播放器,发现自己在数据存储及提取方面掌握不够扎实,故参考资料,重新整理下这方面的知识,并且加入了自己的理解。
(一)SharePreferences:
SharePreferences是一种程序接口,可以在XML文件中储存键值对,其数据可以被创建它的所有组件访问。
可以使用方法Activity.getPreferences(int mode)方法得到默认的preferences文件操作模式,当一个应用程序需要多个preferences时,这时可以使用Context或者Activity的getSharedPreferences(String name,int mode)方法访问。
类型访问权限:
a. MODE_PRIVATE :只有调用程序具有访问该XML文件的权限。
b. MODE_WORLD_READABLE: 所有程序可以读取该XML文件。
c. MODE_WORLD_WRITEABLE: 所有程序可以写该XML文件。
创建和储存shared preferences数据(转):

SharedPreferences sharedPreferences = getSharedPreferences("myDataStorage",Context.MODE_PRIVATE);
        Editor editor = sharedPreferences.edit();
        editor.putString("username","almo");
        editor.putString("password","123455");
        editor.commit();

取回SharedPreferences数据:

SharedPreferences prefs = getSharedPreferences("myDataStorage",Context.MODE_PRIVATE);
        prefs.getString("username","");
        prefs.getString("password","");

(二)SQLite:当需要储存比较大的数据时,通常是表的形式如联系人、歌曲等,就需要使用SQLite,该数据库支持SQL语言。使用SQLite的应用程序都有自己的数据库实例,默认情况下只能被自己访问,该数据库存放于Android设备的/data/data//databases文件夹下。但可以使用内容提供提ContentProvider在应用程序间共享数据库信息。

A. 创建数据库:
首先,你可以创建一个类,来定义你的数据库表的table name以及每个项的名称和一个ID,如:

public class Constants {
    public static final String DATABASE_NAME  = "datastorage";
    public static final int DATABASE_VERSION = 1;
    public static final String TABLE_NAME  = "diaries";
    public static final String TITLE_NAME= "title";
    public static final String CONTENT_NAME = "content";
    public static final String DATE_NAME = "recorddate";
    public static final String KEY_ID  =  "_id";
}

该类定义了创建数据库 时,需要用到的常量。

SQLiteOpenHelper:
然后,你需要创建一个SQLiteOpenHelper或者其子类,该类用来创建数据库表 和更新数据库。主要功能是打开一个数据库,并且当该数据库不存在的时候创建它,根据要求更新它。该类具有延迟打开的功能,防止应用程序 启动时会因长时间的更新数据库而阻塞 。

public class MyDBhelper extends SQLiteOpenHelper {

    private static final String TAG = "MyDBhelper";

    private static final String CREATE_TABLE =
            "create table "+ Constants.TABLE_NAME+ "("+
            Constants.KEY_ID+" integer primary key autoincrement,"+
            Constants.TITLE_NAME + " text not null,"+ Constants.CONTENT_NAME+" text not null,"+
            Constants.DATE_NAME+" long)";

    public MyDBhelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) {
        super(context,name,factory,version);
    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
    }

    @Override
    public synchronized void close() {
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.d(TAG, "oncreate:create all the tables");
        db.execSQL(CREATE_TABLE);
        Log.d(TAG,"after on create");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exits"+Constants.TABLE_NAME);
        onCreate(db);
    }
}

其中,db.execSQL(Sring sql)是用来执行SQL命令的,如创建、更新等 。执行完命令db.execSQL(CREATE_TABLE)时,你就创建了一个数据库,然后调用getWritableDatabase()或者getReadableDatabase()来打开这个数据库,然后你可以添加或者提取数据库的内容了,一般常用的方法为db.public long insert(String table, String nullColumnHack, ContentValues values)、Cursor c = db.query(Constants.TABLE_NAME,null,null,null,null,null,null);
完成你需要的操作后记得要关闭该数据库db.close()。

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/** * Created by almo.liu on 2016/4/15. */
public class MyDB {
    private SQLiteDatabase db;
    private final Context context;
    private final MyDBhelper dbHelper;
    private static final String TAG = "MyDB";

    public MyDB(Context c) {
        context = c;
        dbHelper = new MyDBhelper(context,Constants.DATABASE_NAME,null,Constants.DATABASE_VERSION);
    }
    public void close() {
        db.close();
    }

    public void openW(){
        db = dbHelper.getWritableDatabase();
    }
    public void openR() {
        db = dbHelper.getReadableDatabase();
    }

    public long insertdiary(String title,String content) {
        ContentValues newTaskValue = new ContentValues();
        newTaskValue.put(Constants.TITLE_NAME,title);
        newTaskValue.put(Constants.CONTENT_NAME,content);
        newTaskValue.put(Constants.DATE_NAME,System.currentTimeMillis());
        return  db.insert(Constants.TABLE_NAME,null,newTaskValue);
    }

    public Cursor getdiaries() {
        Cursor c = db.query(Constants.TABLE_NAME,null,null,null,null,null,null);
        return c;
    }
}

有几点值得注意的地方:
首先,ContentValues类的使用,可以简化向数据库中更新 数据:

ContentValues contentValues = new ContentValues();
        contentValues.put(Constants.TITLE_NAME,name.getText().toString());
        contentValues.put(Constants.TITLE_CONTENT,introduction.getText().toString());
        mDb.insert(Constants.TABLE_NAME,null,contentValues);

然后是类Cursor的使用,利用方法query可以得到Cursor的一个引用,此时你需要将指针移到具有数据的地方,默认index为-1:

 Cursor c = mDb.query(Constants.TABLE_NAME,null,null,null,null,null,null);
        if(c.moveToFirst()) {
            do {
                title_name = c.getString(c.getColumnIndex(Constants.TITLE_NAME));
                content_name = c.getString(c.getColumnIndex(Constants.TITLE_CONTENT));
                mArrayAdapter.add(title_name + ":\n" + content_name);

            } while (c.moveToNext());
        }

你可能感兴趣的:(数据存储(一))