Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據存儲方式簡括

Android數據存儲方式簡括

編輯:關於Android編程

Android提供以下四種存儲方式:

SharePreference

SQLite

File

ContentProvider

如果要實現數據共享,正確的方式是使用ContentProvider

 

\

 

SharedPreference

  • “用戶的偏好設置”通常用來存儲程序的一些配置信息。
  • 其存儲在“data/data/程序包名/shared_prefs目錄下。
  • 使用鍵-值的形式來存儲數據;我們只需要調用SharedPreferences的getXxx(name), 就可以根據鍵獲得對應的值!
  • SharedPreference本身只能獲取數據,存儲和修改要通過Editor對象來實現。

     

 

代碼速記:

存儲數據

  1. SharedPreferencessp=context.getSharedPreferences("CITY",MODE_PRIVATE);//獲取對象
  2. Editoreditor=sp.edit();
  3. editor.putString("CityName",City.getCity().getCityName());//存儲數據
  4. editor.commit();//將數據提交

讀取數據

//定義一個讀取SP文件的方法

  1. publicMapread(){
  2. Mapdata=newHashMap();
  3. SharedPreferencessp=mContext.getSharedPreferences("mysp",Context.MODE_PRIVATE);
  4. data.put("username",sp.getString("username",""));//獲取數據;
  5. data.put("passwd",sp.getString("passwd",""));
  6. returndata;
  7. }

SharedPreference工具類:

SPUtils.java
  1. packagecom.jay.sharedpreferencedemo3;
  2.  
  3. importandroid.content.Context;
  4. importandroid.content.SharedPreferences;
  5.  
  6. importjava.util.Map;
  7.  
  8. /**
  9. *CreatedbyJayon2015/9/20002.
  10. */
  11. publicclassSPUtils{
  12. /**
  13. *保存在手機裡的SP文件名
  14. */
  15. publicstaticfinalStringFILE_NAME="my_sp";
  16.  
  17. /**
  18. *保存數據
  19. */
  20. publicstaticvoidput(Contextcontext,Stringkey,Objectobj){
  21. SharedPreferencessp=context.getSharedPreferences(FILE_NAME,context.MODE_PRIVATE);
  22. SharedPreferences.Editoreditor=sp.edit();
  23. if(objinstanceofBoolean){
  24. editor.putBoolean(key,(Boolean)obj);
  25. }elseif(objinstanceofFloat){
  26. editor.putFloat(key,(Float)obj);
  27. }elseif(objinstanceofInteger){
  28. editor.putInt(key,(Integer)obj);
  29. }elseif(objinstanceofLong){
  30. editor.putLong(key,(Long)obj);
  31. }else{
  32. editor.putString(key,(String)obj);
  33. }
  34. editor.commit();
  35. }
  36.  
  37.  
  38. /**
  39. *獲取指定數據
  40. */
  41. publicstaticObjectget(Contextcontext,Stringkey,ObjectdefaultObj){
  42. SharedPreferencessp=context.getSharedPreferences(FILE_NAME,context.MODE_PRIVATE);
  43. if(defaultObjinstanceofBoolean){
  44. returnsp.getBoolean(key,(Boolean)defaultObj);
  45. }elseif(defaultObjinstanceofFloat){
  46. returnsp.getFloat(key,(Float)defaultObj);
  47. }elseif(defaultObjinstanceofInteger){
  48. returnsp.getInt(key,(Integer)defaultObj);
  49. }elseif(defaultObjinstanceofLong){
  50. returnsp.getLong(key,(Long)defaultObj);
  51. }elseif(defaultObjinstanceofString){
  52. returnsp.getString(key,(String)defaultObj);
  53. }
  54. returnnull;
  55. }
  56.  
  57. /**
  58. *刪除指定數據
  59. */
  60. publicstaticvoidremove(Contextcontext,Stringkey){
  61. SharedPreferencessp=context.getSharedPreferences(FILE_NAME,context.MODE_PRIVATE);
  62. SharedPreferences.Editoreditor=sp.edit();
  63. editor.remove(key);
  64. editor.commit();
  65. }
  66.  
  67.  
  68. /**
  69. *返回所有鍵值對
  70. */
  71. publicstaticMapgetAll(Contextcontext){
  72. SharedPreferencessp=context.getSharedPreferences(FILE_NAME,context.MODE_PRIVATE);
  73. Mapmap=sp.getAll();
  74. returnmap;
  75. }
  76.  
  77. /**
  78. *刪除所有數據
  79. */
  80. publicstaticvoidclear(Contextcontext){
  81. SharedPreferencessp=context.getSharedPreferences(FILE_NAME,context.MODE_PRIVATE);
  82. SharedPreferences.Editoreditor=sp.edit();
  83. editor.clear();
  84. editor.commit();
  85. }
  86.  
  87. /**
  88. *檢查key對應的數據是否存在
  89. */
  90. publicstaticbooleancontains(Contextcontext,Stringkey){
  91. SharedPreferencessp=context.getSharedPreferences(FILE_NAME,context.MODE_PRIVATE);
  92. returnsp.contains(key);
  93. }
  94.  
  95. }

SQLite

  1. publicclassMyDBOpenHelperextendsSQLiteOpenHelper{
  2. publicMyDBOpenHelper(Contextcontext,Stringname,CursorFactoryfactory,
  3. intversion){super(context,"my.db",null,1);}
  4. @Override
  5. //數據庫第一次創建時被調用
  6. publicvoidonCreate(SQLiteDatabasedb){
  7. db.execSQL("CREATETABLEperson(personidINTEGERPRIMARYKEYAUTOINCREMENT,nameVARCHAR(20))");
  8.  
  9. }
  10. //軟件版本號發生改變時調用
  11. @Override
  12. publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
  13. db.execSQL("ALTERTABLEpersonADDphoneVARCHAR(12)NULL");
  14. }
  15. }

(2).插入數據:

dbOpenHelper.getWritableDatabase()

  1. publicvoidsave(Personp)
  2. {
  3. SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
  4. db.execSQL("INSERTINTOperson(name,phone)values(?,?)",newString[]{p.getName(),p.getPhone()});
  5. }
 

3.刪除數據:同上

db.execSQL("DELETEFROM person WHEREpersonid = ?",new String[]{id});

4.修改數據:同上

db.execSQL("UPDATEperson SET name =?,phone = ? WHERE personid = ?",newString[]{p.getName(),p.getPhone(),p.getId()});

5.查詢數據:

dbOpenHelper.getReadableDatabase()

  1. publicPersonfind(Integerid)
  2. {
  3. SQLiteDatabasedb=dbOpenHelper.getReadableDatabase();
  4. Cursorcursor=db.rawQuery("SELECT*FROMpersonWHEREpersonid=?",newString[]{id.toString()});
  5. //存在數據才返回true
  6. if(cursor.moveToFirst())
  7. {
  8. intpersonid=cursor.getInt(cursor.getColumnIndex("personid"));
  9. Stringname=cursor.getString(cursor.getColumnIndex("name"));
  10. Stringphone=cursor.getString(cursor.getColumnIndex("phone"));
  11. returnnewPerson(personid,name,phone);
  12. }
  13. cursor.close();
  14. returnnull;
  15. }

6.數據分頁:

dbOpenHelper.getReadableDatabase()

  1. publicListgetScrollData(intoffset,intmaxResult)
  2. {
  3. Listperson=newArrayList();
  4. SQLiteDatabasedb=dbOpenHelper.getReadableDatabase();
  5. Cursorcursor=db.rawQuery("SELECT*FROMpersonORDERBYpersonidASCLIMIT=?,?",
  6. newString[]{String.valueOf(offset),String.valueOf(maxResult)});
  7. while(cursor.moveToNext())
  8. {
  9. intpersonid=cursor.getInt(cursor.getColumnIndex("personid"));
  10. Stringname=cursor.getString(cursor.getColumnIndex("name"));
  11. Stringphone=cursor.getString(cursor.getColumnIndex("phone"));
  12. person.add(newPerson(personid,name,phone));
  13. }
  14. cursor.close();
  15. returnperson;
  16. }

7.查詢記錄數:

dbOpenHelper.getReadableDatabase()

  1. publiclonggetCount()
  2. {
  3. SQLiteDatabasedb=dbOpenHelper.getReadableDatabase();
  4. Cursorcursor=db.rawQuery("SELECTCOUNT(*)FROMperson",null);
  5. cursor.moveToFirst();
  6. longresult=cursor.getLong(0);
  7. cursor.close();
  8. returnresult;
  9. }

PS:除了上面獲取條數的方法外還可以使用cursor.getCount()方法獲得數據的條數, 但是SQL語句要改改!比如SELECT * FROMperson;

 

File

文件存儲讀寫

openFileOutput(filename,mode) 往文件寫數據

openFileIntput(filename) 讀取文件中的信息到程序

getDir(name,mode) 在app的data目錄下獲取或創建name對應的子目錄

getFileDir() 獲取app的data目錄的file目錄的絕對路徑

String[]fileList() 返回app的data目錄下的全部文件

deleteFile(filename) 刪除app的data目錄下的指定文件

 

ContentProvider

ContentProvider相對於其它的方式比較復雜。它能夠實現跨應用之間的數據操作。利用ContentResolver對象的delete、update、insert、query等方法去操ContentProvider的對象,讓ContentProvider對象的方法去對數據操作。實現方式為:

 

 

  •  

在A程序中定義一個ContentProvider,重載其增刪查改等方法;

  • 在A程序中的AndroidManifest.xml中注冊ContentProvider;
  • 在B程序中通過ContentResolver和Uri來獲取ContentProvider的數據,同樣利用Resolver的增刪查改方法來獲得和處理數據。

在A程序定義一個Provider

新建一個類,繼承ContentProvider,並重載其delete()、insert()、query()、update()、getType()、onCreate()方法。譬如下面的例子,重載其onCreate和query方法 注:從5.0開始,默認短信應用外的軟件不能以寫入短信數據庫的形式發短信!
  1. publicclassMyProviderextendsContentProvider{
  2.  
  3. @Override
  4. publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
  5. //TODOAuto-generatedmethodstub
  6. return0;
  7. }
  8.  
  9. @Override
  10. publicStringgetType(Uriuri){
  11. //TODOAuto-generatedmethodstub
  12. returnnull;
  13. }
  14.  
  15. @Override
  16. publicUriinsert(Uriuri,ContentValuesvalues){
  17. //TODOAuto-generatedmethodstub
  18. returnnull;
  19. }
  20.  
  21. @Override
  22. publicbooleanonCreate(){
  23. //新建個數據庫並插入一條數據
  24. SQLiteDatabasedb=this.getContext().openOrCreateDatabase("test_db2.db",Context.MODE_PRIVATE,null);
  25. db.execSQL("CREATETABLEt_user(idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTNOTNULL)");
  26. ContentValuesvalues=newContentValues();
  27. values.put("name","liangjh2");
  28. db.insert("t_user","id",values);
  29. db.close();
  30. returnfalse;
  31. }
  32.  
  33. @Override
  34. publicCursorquery(Uriuri,String[]projection,Stringselection,
  35. String[]selectionArgs,StringsortOrder){
  36. //獲取數據
  37. SQLiteDatabasedb=this.getContext().openOrCreateDatabase("test_db2.db",Context.MODE_PRIVATE,null);
  38. Cursorc=db.query("t_user",null,null,null,null,null,null);
  39. db.close();
  40. returnc;
  41. }
  42.  
  43. @Override
  44. publicintupdate(Uriuri,ContentValuesvalues,Stringselection,
  45. String[]selectionArgs){
  46. //TODOAuto-generatedmethodstub
  47. return0;
  48. }
  49.  
  50. }

注冊ContentProvider 在AndroidManifest.xml中聲明ContentProvider,authorities屬性定義了ContentProvider的Uri標識。關於Uri標識屬另一個范疇,自行查詢。provider標識要放在裡面。如果遇到了"Permission Denial: opening provide..."的錯誤,可以試試在節點加“android:exported="true"”。

    ...
    

 

在B程序獲取數據 用Context獲取到當前的ContentResolver,根據Uri地址和ContentResolver的query方法獲取A程序的數據。Uri地址和A程序中AndroidManifest.xml定義的autorities要一致。當然,同類可以進行其它的操作。
  1. Contextctx=MainActivity.this;
  2. ContentResolverresolver=ctx.getContentResolver();
  3. Uriuri=Uri.parse("content://com.example.androidtestdemo");
  4. Cursorc=resolver.query(uri,null,null,null,null);
  5. c.moveToFirst();
  6. while(!c.isAfterLast()){
  7. for(inti=0,j=c.getColumnCount();iLog.v("Android2",""+c.getString(i));
  8. }
  9. c.moveToNext();
  10. }
讀取收件箱信息:
private void getMsgs(){
    Uri uri = Uri.parse("content://sms/");
    ContentResolver resolver = getContentResolver();
    //獲取的是哪些列的信息
    Cursor cursor = resolver.query(uri, new String[]{"address","date","type","body"}, null, null, null);
    while(cursor.moveToNext())
    {
        String address = cursor.getString(0);
        String date = cursor.getString(1);
        String type = cursor.getString(2);
        String body = cursor.getString(3);
        System.out.println("地址:" + address);
        System.out.println("時間:" + date);
        System.out.println("類型:" + type);
        System.out.println("內容:" + body);
        System.out.println("======================");
    }
    cursor.close();
}

往AndroidManifest.xml加入讀取收件箱的權限:

 android:name="android.permission.READ_SMS"/>

往收件箱裡插入一條信息

private void insertMsg() {
    ContentResolver resolver = getContentResolver();
    Uri uri = Uri.parse("content://sms/");
    ContentValues conValues = new ContentValues();
    conValues.put("address", "123456789");
    conValues.put("type", 1);
    conValues.put("date", System.currentTimeMillis());
    conValues.put("body", "no zuo no die why you try!");
    resolver.insert(uri, conValues);
    Log.e("HeHe", "短信插入完畢~");
}
  • SQLite是一個輕量級關系型數據庫,只有NULL、INTEGER、REAL(浮點數)、TEXT(字符串)和BLOB(大數據)五種類型,不存在BOOLEAN和DATE類型。
  • SQLiteOpenHelper:抽象類,我們通過繼承該類,然後重寫數據庫創建以及更新的方法, 我們還可以通過該類的對象獲得數據庫實例,或者關閉數據庫!
  • SQLiteDatabase:數據庫訪問類:我們可以通過該類的對象來對數據庫做一些增刪改查的操作
  • Cursor:游標,有點類似於JDBC裡的resultset,結果集!可以簡單理解為指向數據庫中某 一個記錄的指針!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved