1. SharedPreferences
SharedPreferences輕量級 格式簡單 以鍵值對的形式存在XML中 一般用於存儲配置信息、個人偏好
public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
// Restore preferences
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop(){
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Commit the edits!
editor.commit();
}
}
2. 內部存儲
默認情況下,保存到內部存儲的文件是應用的私有文件,其他應用(和用戶)不能訪問這些文件。 當用戶卸載您的應用時,這些文件也會被移除。
1. 要創建私有文件並寫入到內部存儲:
- 使用文件名稱和操作模式調用 openFileOutput()。 這將返回一個 FileOutputStream。
- 使用 write() 寫入到文件。
- 使用 close() 關閉流式傳輸。
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
2. 要從內部存儲讀取文件:
- 調用 openFileInput() 並向其傳遞要讀取的文件名稱。 這將返回一個 FileInputStream。
- 使用 read() 讀取文件字節。
- 然後使用 close() 關閉流式傳輸。
3. 外部存儲
1. 獲取外部存儲的訪問權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 檢查外部存儲是否可用
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
3. 建議:一般APP的文件路徑:/mnt/sdcard/Android/data/包名/子目錄
這樣做數據文件就相當於和app綁定在了一起,卸載後,數據也會跟着刪除掉,而放在其他目錄下的文件則不受卸載的影響。
4. 創建
File sdRoot = Environment.getExternolStorageDirectory();
File appRoot = new File(sdRoot, "Android/data/"+getPackageName());
if(!appRoot.exists()){
appRoot.mkdirs();
}
4. SQLite數據庫
1. 繼承 SQLiteOpenHelper
public class DictionaryOpenHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
private static final String DICTIONARY_TABLE_NAME = "dictionary";
private static final String DICTIONARY_TABLE_CREATE =
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
KEY_WORD + " TEXT, " +
KEY_DEFINITION + " TEXT);";
DictionaryOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DICTIONARY_TABLE_CREATE);
}
}
2. 封裝crud
- 獲取SQLiteOpenHelper實現的實例
- 通過實例的getWritableDatabase() 和 getReadableDatabase()來獲取數據庫的 SQLiteDatabase 對象db,該對象提供操作數據庫的方法
說明:當儲存空間不足時,getWritableDatabase()會拋出異常,需要catch
當Activity結束時,需要關閉數據庫
public void finish(){
if(db.isOpen()){
db.close();
}
super.finish();
}
增
db.insert(表名, null, 數據);
刪
db.delete(表名, "name like ?", new String[]{"test%"});
delete from cust where name like 'test%';
改
db.update(表名, 數據, "name = ?", new String[]{"brad"});
update cust set name='趙', birthday='1999-01-01' where name='brad'
查
Cursor cursor = db.query(表名, null, null, null, null, null, null);
while(cursor.moveToNext()){
cursor.getString(cursor.getColumnIndex("id"));
}
getCount();//獲取查詢結果數量
參數說明(表名,查詢字段數組,條件,條件值數組,group by,having,order by)
例子:
selete id, name, birthday from cust where id>4 order by = id;
db.query("cust", new String[]{"id","name","birthday"}, "id > ?", new String[]{"4"}, null, null, "id");