Android中的数据存储方式
Android數據存儲的5中方式總結:
A:使用SharedPreferences存儲方式
B:文件存儲數據
C:SQLite數據庫存儲數據
D:使用ContentProvider存儲數據
E:網絡存儲數據
1.sharepreferences是Android平臺的一個輕量級的存儲類,只能保存少量數據,且這些數據的格式非常簡單:字符串、基本類型的值。主要用于保存一些常用的配置:比如窗口狀態,是否打開音樂、是否震動。解鎖密碼口令等等。
核心原理:保存基于XML文件存儲的key-value鍵值對數據,通常用來存儲一些簡單地配置信息。它對象本身只能獲取數據而不支持存儲和修改,存儲和修改是通過sharepreference.edit()獲取內部接口editor對象實現。他本是一個接口,程序無法直接創建他的實例,只能通過context提供getsharepreference(String name,int ?mode)方法獲取它name表示操作的xml文件名。第二個參數具體如下:
class ViewOcl implements View.OnClickListener{
? ? ? ? @Override
? ? ? ? public void onClick(View v) {
? ? ? ? ? ? switch(v.getId()){
? ? ? ? ? ? case R.id.btnSet:
? ? ? ? ? ? ? ? //步驟1:獲取輸入值
? ? ? ? ? ? ? ? String code = txtCode.getText().toString().trim();
? ? ? ? ? ? ? ? //步驟2-1:創建一個SharedPreferences.Editor接口對象,lock表示要寫入的XML文件名,MODE_WORLD_WRITEABLE寫操作
? ? ? ? ? ? ? ? SharedPreferences.Editor editor = getSharedPreferences("lock", MODE_WORLD_WRITEABLE).edit();
? ? ? ? ? ? ? ? //步驟2-2:將獲取過來的值放入文件
? ? ? ? ? ? ? ? editor.putString("code", code);
? ? ? ? ? ? ? ? //步驟3:提交
? ? ? ? ? ? ? ? editor.commit();
? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(), "口令設置成功", Toast.LENGTH_LONG).show();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case R.id.btnGet:
? ? ? ? ? ? ? ? //步驟1:創建一個SharedPreferences接口對象
? ? ? ? ? ? ? ? SharedPreferences read = getSharedPreferences("lock", MODE_WORLD_READABLE);
? ? ? ? ? ? ? ? //步驟2:獲取文件中的值
? ? ? ? ? ? ? ? String value = read.getString("code", "");
? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(), "口令為:"+value, Toast.LENGTH_LONG).show();
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }}}}
2.文件存儲數據
?核心原理: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():返回該應用數據文件夾的全部文件 。
如果要對SD卡進行操作則:
讀寫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卡的權限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
? 第三種:SQLite存儲數據 ? ? ? ? ?
SQLite是輕量級嵌入式數據庫引擎,它支持sql語言,并且只利用很少的內存就有很好的性能。主流的移動設備都以它作為復雜數據的儲存引擎。我們常用的方法不外乎添加,更新和刪除,也就是常說的增刪改查。
數據的添加
1.使用insert方法
1 ContentValues cv = new ContentValues();//實例化一個ContentValues用來裝載待插入的數據 2 cv.put("title","you are beautiful");//添加title 3 cv.put("weather","sun"); //添加weather 4 cv.put("context","xxxx"); //添加context 5 String publish = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 6 .format(new Date()); 7 cv.put("publish ",publish); //添加publish 8 db.insert("diary",null,cv);//執行插入操作2.使用execsql方式實現
String ?sql = "insert into user(username,password) values ('jack Johnson','muisc' )"//插入語句
db.execSQL(sql);//執行sql語句
數據的刪除
同樣有2種方式可以實現
String whereClause = "username=?";//刪除的條件 String[] whereArgs = {"Jack Johnson"};//刪除的條件參數 db.delete("user",whereClause,whereArgs);//執行刪除使用execsql方式實現
String sql = "delete from user where username= 'jack Johnson' ";//刪除操作
db.execSQL(sql);//執行刪除操作
數據修改
仍是2種方式
ContentValues cv = new ContentValues();//實例化ContentValues cv.put("password","iHatePopMusic");//添加要更改的字段及內容 String whereClause = "username=?";//修改條件 String[] whereArgs = {"Jack Johnson"};//修改條件的參數 db.update("user",cv,whereClause,whereArgs);//執行修改 使用execSQL方式的實現String sql = "update user set password = 'music' where name = 'jack johnson'";修改內容
db.execSQL(sql);//執行修改
數據查詢
1 db.rawQuery(String sql, String[] selectionArgs); 2 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); 3 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 4 db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); ?其中:
- table:表名稱
- colums:表示要查詢的列所有名稱集
- selection:表示WHERE之后的條件語句,可以使用占位符
- selectionArgs:條件語句的參數數組
- groupBy:指定分組的列名
- having:指定分組條件,配合groupBy使用
- orderBy:y指定排序的列名
- limit:指定分頁參數
- distinct:指定“true”或“false”表示要不要過濾重復值
- Cursor:返回值,相當于結果集ResultSet
最后,他們同時返回一個Cursor對象,代表數據集的游標,有點類似于JavaSE中的ResultSet。下面是Cursor對象的常用方法:
1 c.move(int offset); //以當前位置為參考,移動到指定行 2 c.moveToFirst(); //移動到第一行 3 c.moveToLast(); //移動到最后一行 4 c.moveToPosition(int position); //移動到指定行 5 c.moveToPrevious(); //移動到前一行 6 c.moveToNext(); //移動到下一行 7 c.isFirst(); //是否指向第一條 8 c.isLast(); //是否指向最后一條 9 c.isBeforeFirst(); //是否指向第一條之前 10 c.isAfterLast(); //是否指向最后一條之后 11 c.isNull(int columnIndex); //指定列是否為空(列基數為0) 12 c.isClosed(); //游標是否已關閉 13 c.getCount(); //總數據項數 14 c.getPosition(); //返回當前游標所指向的行數 15 c.getColumnIndex(String columnName);//返回某列名對應的列索引值 16 c.getString(int columnIndex); //返回當前行指定列的值實現代碼
String[] params = {12345,123456};Cursor cursor = db.query("user",columns,"ID=?",params,null,null,null);//查詢并獲得游標 if(cursor.moveToFirst()){//判斷游標是否為空for(int i=0;i<cursor.getCount();i++){cursor.move(i);//移動到指定記錄String username = cursor.getString(cursor.getColumnIndex("username");String password = cursor.getString(cursor.getColumnIndex("password"));} }
通過rawQuery實現的帶參數查詢
Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable"); //Cursor c = db.rawQuery("s name, inventory FROM mytable where ID=?",new Stirng[]{"123456"}); result.moveToFirst(); while (!result.isAfterLast()) { int id=result.getInt(0); String name=result.getString(1); int inventory=result.getInt(2); // do something useful with these result.moveToNext(); } result.close(); 4.content provider存儲方式
?Content Provider為存儲數據和獲取數據提供了統一的接口,它可以完成在不同應用程序下的數據共享,而SQLite只能在同一個程序中共享數據。另外android為一些常見的數據,比如說音頻,視頻,圖片,通訊錄等提供了Content Provider,這樣我們就可以很方便的對這些類型的數據操作了。
? ? ? 使用ContentProvider的好處是開發人員不需要考慮數據內部是怎么存儲的,比如說如果我們想利用ContenProvider來存數據,只需告訴insert函數該ContentProvider的uri和想存入的數據(包括列名和數值),查詢時也是一樣,只需輸入Uri和查詢的表,列名和查詢條件,至于ContentProvider里面是怎么進行這些操作的我們不需要知道。
5.網絡存儲數據
通過網絡來獲取和保存數據資源,前提是需要設備保持網絡連接狀態。例子通過URL獲取文件的信息
總結
以上是生活随笔為你收集整理的Android中的数据存储方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神舟笔记本bios怎么设置u盘启动 如何
- 下一篇: 过年有哪些必买的年货零食?