Android平臺進行數據存儲的五大方式,分別如下:
第一種:使用SharedPreferences存儲數據
適用范圍:保存少量的數據,且這些數據的格式非常簡單:字符串型、基本類型的值。比如應用程序的各種配置信息(如是否打開音效、是否使用震動效果、小游戲的玩家積分等),解鎖口令密碼等
核心原理:保存基于XML文件存儲的key-value鍵值對數據,通常用來存儲一些簡單的配置信息。通過DDMS的File Explorer面板,展開文件瀏覽樹,很明顯SharedPreferences數據總是存儲在/data/data//shared_prefs目錄下。SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過SharedPreferences.edit()獲取的內部接口Editor對象實現。SharedPreferences本身是一 個接口,程序無法直接創建SharedPreferences實例,只能通過Context提供的getSharedPreferences(String name, int mode)方法來獲取SharedPreferences實例,該方法中name表示要操作的xml文件名,第二個參數具體如下:
Context.MODE_PRIVATE:指定該SharedPreferences數據只能被本應用程序讀、寫。
Context.MODE_WORLD_READABLE:指定該SharedPreferences數據能被其他應用程序讀,但不能寫。
Context.MODE_WORLD_WRITEABLE:指定該SharedPreferences數據能被其他應用程序讀,寫
Editor有如下主要重要方法:
SharedPreferences.Editor clear():清空SharedPreferences里所有數據
SharedPreferences.Editor putXxx(String key , xxx value):向SharedPreferences存入指定key對應的數據,其中xxx可以是boolean,float,int等各種基本類型據
SharedPreferences.Editor remove():刪除SharedPreferences中指定key對應的數據項
boolean commit():當Editor編輯完成后,使用該方法提交修改
讀寫其他應用的SharedPreferences:
1、在創建SharedPreferences時,指定MODE_WORLD_READABLE模式,表明該SharedPreferences數據可以被其他程序讀取
2、創建其他應用程序對應的Context:
Context pvCount = createPackageContext("com.tony.app", Context.CONTEXT_IGNORE_SECURITY);這里的com.tony.app就是其他程序的包名
3、使用其他程序的Context獲取對應的SharedPreferences
SharedPreferences read = pvCount.getSharedPreferences("lock", Context.MODE_WORLD_READABLE);
4、如果是寫入數據,使用Editor接口即可,所有其他操作均和前面一致。
SharedPreferences對象與SQLite數據庫相比,免去了創建數據庫,創建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數據類型,比如其無法進行條件查詢等。所以不論SharedPreferences的數據存儲操作是如何簡單,它也只能是存儲方式的一種補充,而無法完全替代如SQLite數據庫這樣的其他數據存儲方式。
第二種:文件存儲數據
核心原理: Context提供了兩個方法來打開數據文件里的文件IO流FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),這兩個方法第一個參數 用于指定文件名,第二個參數指定打開文件的模式。具體有以下值可選:
MODE_PRIVATE:為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中。可以使用Context.MODE_APPEND
MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。
MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取;
MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入。
除此之外,Context還提供了如下幾個重要的方法:
getDir(String name , int mode):在應用程序的數據文件夾下獲取或者創建name對應的子目錄
File getFilesDir():獲取該應用程序的數據文件夾得絕對路徑
String[] fileList():返回該應用數據文件夾的全部文件
openFileOutput()方法的第一參數用于指定文件名稱,不能包含路徑分隔符“/”,如果文件不存在,Android會自動創建它。創建的文件保存在/data/data//files目錄,如:/data/data/cn.tony.app/files/message.txt,
下面講解某些特殊文件讀寫需要注意的地方:
讀寫sdcard上的文件
其中讀寫步驟按如下進行:
1、調用Environment的getExternalStorageState()方法判斷手機上是否插了sd卡,且應用程序具有讀寫SD卡的權限,如下代碼將返回true
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2、調用Environment.getExternalStorageDirectory()方法來獲取外部存儲器,也就是SD卡的目錄,或者使用"/mnt/sdcard/"目錄
3、使用IO流操作SD卡上的文件
注意點:手機應該已插入SD卡,對于模擬器而言,可通過mksdcard命令來創建虛擬存儲卡
必須在AndroidManifest.xml上配置讀寫SD卡的權限
第三種:SQLite存儲數據
SQLite是輕量級嵌入式數據庫引擎,它支持SQL語言,并且只利用很少的內存就有很好的性能。現在的主流移動設備像Android、iPhone等都使用SQLite作為復雜數據的存儲引擎,在我們為移動設備開發應用程序時,也許就要使用到SQLite來存儲我們大量的數據,所以我們就需要掌握移動設備上的SQLite開發技巧
SQLiteDatabase類為我們提供了很多種方法,上面的代碼中基本上囊括了大部分的數據庫操作;對于添加、更新和刪除來說,我們都可以使用
1db.executeSQL(String sql);2db.executeSQL(String sql, Object[] bindArgs);//sql語句中使用占位符,然后第二個參數是實際的參數集
各參數說明:
·table:表名稱
·colums:表示要查詢的列所有名稱集
·selection:表示WHERE之后的條件語句,可以使用占位符
·selectionArgs:條件語句的參數數組
·groupBy:指定分組的列名
·having:指定分組條件,配合groupBy使用
·orderBy:y指定排序的列名
·limit:指定分頁參數
·distinct:指定“true”或“false”表示要不要過濾重復值
·Cursor:返回值,相當于結果集ResultSet
SQLiteOpenHelper類介紹
SQLiteOpenHelper是SQLiteDatabase的一個幫助類,用來管理數據庫的創建和版本的更新。一般是建立一個類繼承它,并實現它的onCreate和onUpgrade方法。
Android sqlite3數據庫管理工具
Android SDK的tools目錄下提供了一個sqlite3.exe工具,這是一個簡單的sqlite數據庫管理工具。開發者可以方便的使用其對sqlite數據庫進行命令行的操作。
程序運行生成的*.db文件一般位于"/data/data/項目名(包括所處包名)/databases/*.db",因此要對數據庫文件進行操作需要先找到數據庫文件:
1、進入shell 命令
adb shell
2、找到數據庫文件
#cd data/data
#ls ???????????????--列出所有項目
#cd project_name ??--進入所需項目名
#cd databases
#ls ???????????????--列出現寸的數據庫文件
3、進入數據庫
#sqlite3 test_db ??--進入所需數據庫
會出現類似如下字樣:
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
至此,可對數據庫進行sql操作。
4、sqlite常用命令
>.databases ???????--產看當前數據庫
>.tables ??????????--查看當前數據庫中的表
>.help ????????????--sqlite3幫助
>.schema ???????????--各個表的生成語句