Android提供了5種方式來讓用戶保存持久化應用程式資料,根據自己的需求來做選擇,比如資料是否是應用程式私有的,是否能被其他程式訪問,需要多少資料存盤空間等,分別是:
- 檔案存盤資料
- 使用SharedPreferences存盤資料
- SQLite資料庫存盤資料
- 使用ContentProvider存盤資料
- 網路存盤資料
一 檔案存盤資料
1.1 Android檔案的操作模式

1.2 檔案相關的操作方法

1.3 檔案讀寫
Android中的檔案讀寫和Java中的檔案I/O相同,流程也很簡單,下面我們來寫個簡單的示例:
寫入檔案
public void save(){
String data = "save something here";
FileOutputStream out = null;
ButteredWriter writer = null;
try{
out = openFileOutput("data",Context.MODE_PRIVATE);
writer = new ButteredWriter(new OutputSreamWriter(out));
writer.write(data);
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(writer!=null){
writer.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
讀取資料
public String load(){
FileInputStream in = null;
ButteredReader reader = null;
StringBuilder builder = new StringBuilder();
try{
in = openFileInput("data");
reader = new ButteredReader(new InputStreamReader(in));
String line= "";
while((line = reader.readline()) != null){
builder.append();
}
}catch(IOException e){
e.printStackTrace();
}finally{
if(reader != null){
try{
reader.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
二 SharedPreferences存盤資料
2.1 使用流程

2.2 使用示例
存盤資料
呼叫SharedPreferences物件的edit()方法獲取一個SharedPreferences.Editor物件
向Editor物件中添加資料putBoolean、putString等
呼叫commit()方法提交資料
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","ZhangSan");
editor.putInt("age",12);
editor.putBoolean("isMarried",false);
editor.commit();
從SharedPreferences檔案中讀取資料
SharedPreferences pref = getSharedPreferences("data",MODE_PRIVATE);
String name = pref.getString("name");
int age = pref.getInt("age");
boolean isMarried = pref.getBoolean("isMarried");
三 SQLite資料庫存盤資料
Sqlite簡介:
Sqlite資料庫是一種輕量級資料庫,它具備跨平臺,多語言操作等優點,它廣泛用于包括瀏覽器、IOS,Android以及一些便攜需求的小型web應用系統,它具備占用資源低,處理速度快等優點,
3.1 SQLite基礎概念
①SQLite是一個輕量級的關系型資料庫,運算速度快,占用資源少,很適合在移動設備上使用, 不僅支持標準SQL語法,還遵循ACID(資料庫事務)原則,無需賬號,使用起來非常方便!
②前面我們學習了使用檔案與SharedPreference來保存資料,但是在很多情況下, 檔案并不一定是有效的,如多執行緒并發訪問是相關的;app要處理可能變化的復雜資料結構等等! 比如銀行的存錢與取錢!使用前兩者就會顯得很無力或者繁瑣,資料庫的出現可以解決這種問題, 而Android又給我們提供了這樣一個輕量級的SQLite,為何不用?
③SQLite支持五種資料型別:NULL,INTEGER,REAL(浮點數),TEXT(字串文本)和BLOB(二進制物件) 雖然只有五種,但是對于varchar,char等其他資料型別都是可以保存的;因為SQLite有個最大的特點: 你可以各種資料型別的資料保存到任何欄位中而不用關心欄位宣告的資料型別是什么,比如你 可以在Integer型別的欄位中存放字串,當然除了宣告為主鍵INTEGER PRIMARY KEY的欄位只能夠存盤64位整數! 另外, SQLite 在決議CREATE TABLE 陳述句時, 會忽略 CREATE TABLE 陳述句中跟在欄位名后面的資料型別資訊如下面陳述句會忽略 name欄位的型別資訊: CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
幾個相關的類:
使用資料庫時用到的三個類:
SQLiteOpenHelper:抽象類,我們通過繼承該類,然后重寫資料庫創建以及更新的方法, 我們還可以通過該類的物件獲得資料庫實體,或者關閉資料庫!
SQLiteDatabase:資料庫訪問類:我們可以通過該類的物件來對資料庫做一些增刪改查的操作
Cursor:游標,有點類似于JDBC里的resultset,結果集!可以簡單理解為指向資料庫中某 一個記錄的指標!
SQLiteDatabase相關方法
execSQL(SQL,Object[]):使用帶占位符的SQL陳述句,這個是執行修改資料庫內容的sql陳述句用的
rawQuery(SQL,Object[]):使用帶占位符的SQL查詢操作 另外前面忘了介紹下Curosr這個東西以及相關屬性,這里補充下: ——Cursor物件有點類似于JDBC中的ResultSet,結果集!使用差不多,提供一下方法移動查詢結果的記錄指標:
move(offset):指定向上或者向下移動的行數,整數表示向下移動;負數表示向上移動!
moveToFirst():指標移動到第一行,成功回傳true,也說明有資料
moveToLast():指標移動到最后一樣,成功回傳true;
moveToNext():指標移動到下一行,成功回傳true,表明還有元素!
moveToPrevious():移動到上一條記錄
getCount( )獲得總得資料條數
isFirst():是否為第一條記錄
isLast():是否為最后一項
moveToPosition(int):移動到指定行
3.2 SQLite使用
1.插入資料:
public void save(Person p)
{
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.execSQL("INSERT INTO person(name,phone) values(?,?)",
new String[]{p.getName(),p.getPhone()});
}
2.洗掉資料:
public void delete(Integer id)
{
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.execSQL("DELETE FROM person WHERE personid = ?",
new String[]{id});
}
3.修改資料:
public void update(Person p)
{
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.execSQL("UPDATE person SET name = ?,phone = ? WHERE personid = ?",
new String[]{p.getName(),p.getPhone(),p.getId()});
}
4.查詢資料:
public Person find(Integer id)
{
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM person WHERE personid = ?",
new String[]{id.toString()});
//存在資料才回傳true
if(cursor.moveToFirst())
{
int personid = cursor.getInt(cursor.getColumnIndex("personid"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
return new Person(personid,name,phone);
}
cursor.close();
return null;
}
5.資料分頁:
public List<Person> getScrollData(int offset,int maxResult)
{
List<Person> person = new ArrayList<Person>();
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM person ORDER BY personid ASC LIMIT= ?,?",
new String[]{String.valueOf(offset),String.valueOf(maxResult)});
while(cursor.moveToNext())
{
int personid = cursor.getInt(cursor.getColumnIndex("personid"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
person.add(new Person(personid,name,phone)) ;
}
cursor.close();
return person;
}
6.查詢記錄數:
public long getCount()
{
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT COUNT (*) FROM person",null);
cursor.moveToFirst();
long result = cursor.getLong(0);
cursor.close();
return result;
}
四 ContentProvider存盤資料
4.1 相關概念
Android系統中能實作所有應用程式共享的一種資料存盤方式,由于資料通常在各應用間的是互相私密的,所以此存盤方式較少使用,但是其又是必不可少的一種存盤方式,例如音頻,視頻,圖片和通訊錄,一般都可以采用此種方式進行存盤,每個ContentProvider都會對外提供一個公共的URI(包裝成Uri物件),如果應用程式有資料需要共享時,就需要使用ContentProvider為這些資料定義一個URI,然后其他的應用程式就通過Content Provider傳入這個URI來對資料進行操作,
一個程式可以通過實作一個ContentProvider的抽象介面將自己的資料完全暴露出去,而且ContentProviders是以類似資料庫中表的方式將資料暴露,也就是說ContentProvider就像一個“資料庫”,那么外界獲取其提供的資料,也就應該與從資料庫中獲取資料的操作基本一樣,只不過是采用URI來表示外界需要訪問的“資料庫”,
4.1 使用相關
1.定義一個繼承自ContentProvider基類的類,
實作如下幾個方法:
onCreate():在ContentProvider創建后會被呼叫,
insert():根據Uri插入values對應的資料,
delete():根據Uri洗掉selection條件所匹配的全部記錄,
update():根據Uri修改selection條件所匹配的全部記錄,
query():根據Uri查詢出selection條件所匹配的全部記錄,projection是一個列名串列,表明只選擇出指定的資料列,
getType():回傳當前Uri所代表的資料的MIME型別,
在AndroidManifest.xml中注冊自定義的ContentProvider類,注冊時還需要指定authorities屬性即Uri,
2.Uri是什么?
Uri代表了要操作的資料表的絕對路徑,它主要包含了兩個部分資訊:
需要操作的ContentProvider
對ContentProvider中的那個表進行操作,
一個Uri由以下幾個部分組成:
- schema:Android固定設定為 content://
- Authority:用于唯一標識這個ContentProvider,外部呼叫者可以根據這個標識找到它,
- path:要操作的資料庫表,
- id:可選欄位,用于操作特定的資料項,
3.ContentResolver操作資料
ContentProvider的作用是暴露可供操作的資料,其他應用程式通過ContentResolver操作ContentProvider所暴露的資料,
首先獲取ContentResolver物件:
getContentResolver():獲取應用默認的ContentResolver,
接下來通過ContentResolver物件操作資料:
insert():向Uri對應的ContentProvider中插入values對應的資料,
delete():洗掉Uri對應的ContentProvider中selection條件所匹配的資料,
update():更新Uri對應的ContentProvider中selection條件所匹配的資料,
query():查詢Uri對應的ContentProvider中selection條件所匹配的資料,
五 網路存盤資料
網路存盤:是通過網路提供的存盤空間來存盤/獲取資料資訊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/294006.html
標籤:其他
上一篇:給Fruit類添加Serializable介面(承接上一文章的補充)
下一篇:Android 人臉識別
