这段时间在写自己的播放器,发现自己在数据存储及提取方面掌握不够扎实,故参考资料,重新整理下这方面的知识,并且加入了自己的理解。
(一)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());
}