編輯:關於Android編程
Android存儲五大方式:
1 使用SharedPreferences存儲數據
2 文件存儲數據
3 SQLite數據庫存儲數據
4 使用ContentProvider存儲數據
5 網絡存儲
第一種:使用SharedPreferences存儲數據
適用范圍:保存少量的數據,且這些數據的格式非常簡單:字符串型、基本類型的值。比如應用程序的各種配置信息(如是否打開音效、是否使用震動效果、小游戲的玩家積分等),解鎖口 令密碼等
核心原理:保存基於XML文件存儲的key-value鍵值對數據,通常用來存儲一些簡單的配置信息。通過DDMS的File Explorer面板,展開文件浏覽樹,很明顯SharedPreferences數據總是存儲在/data/data/
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編輯完成後,使用該方法提交修改
實際案例:運行界面如下
這裡只提供了兩個按鈕和一個輸入文本框,布局簡單,故在此不給出界面布局文件了,程序核心代碼如下:
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; } } }
讀寫其他應用的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():返回該應用數據文件夾的全部文件
實際案例:界面沿用上圖
核心代碼如下:
public String read() { try { FileInputStream inStream = this.openFileInput("message.txt"); byte[] buffer = new byte[1024]; int hasRead = 0; StringBuilder sb = new StringBuilder(); while ((hasRead = inStream.read(buffer)) != -1) { sb.append(new String(buffer, 0, hasRead)); } inStream.close(); return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } public void write(String msg){ // 步驟1:獲取輸入值 if(msg == null) return; try { // 步驟2:創建一個FileOutputStream對象,MODE_APPEND追加模式 FileOutputStream fos = openFileOutput("message.txt", MODE_APPEND); // 步驟3:將獲取過來的值放入文件 fos.write(msg.getBytes()); // 步驟4:關閉數據流 fos.close(); } catch (Exception e) { e.printStackTrace(); } }
openFileOutput()方法的第一參數用於指定文件名稱,不能包含路徑分隔符“/” ,如果文件不存在,Android 會自動創建它。創建的文件保存在/data/data/
下面講解某些特殊文件讀寫需要注意的地方:
讀寫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卡的權限
案例代碼:
// 文件寫操作函數 private void write(String content) { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 如果sdcard存在 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + DIR + File.separator + FILENAME); // 定義File類對象 if (!file.getParentFile().exists()) { // 父文件夾不存在 file.getParentFile().mkdirs(); // 創建文件夾 } PrintStream out = null; // 打印流對象用於輸出 try { out = new PrintStream(new FileOutputStream(file, true)); // 追加文件 out.println(content); } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { out.close(); // 關閉打印流 } } } else { // SDCard不存在,使用Toast提示用戶 Toast.makeText(this, "保存失敗,SD卡不存在!", Toast.LENGTH_LONG).show(); } } // 文件讀操作函數 private String read() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 如果sdcard存在 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + DIR + File.separator + FILENAME); // 定義File類對象 if (!file.getParentFile().exists()) { // 父文件夾不存在 file.getParentFile().mkdirs(); // 創建文件夾 } Scanner scan = null; // 掃描輸入 StringBuilder sb = new StringBuilder(); try { scan = new Scanner(new FileInputStream(file)); // 實例化Scanner while (scan.hasNext()) { // 循環讀取 sb.append(scan.next() + "\n"); // 設置文本 } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } finally { if (scan != null) { scan.close(); // 關閉打印流 } } } else { // SDCard不存在,使用Toast提示用戶 Toast.makeText(this, "讀取失敗,SD卡不存在!", Toast.LENGTH_LONG).show(); } return null; }
第三種:SQLite存儲數據
SQLite是輕量級嵌入式數據庫引擎,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。現在的主流移動設備像Android、iPhone等都使用SQLite作為復雜數據的存儲引擎,在我們為移動設備開發應用程序時,也許就要使用到SQLite來存儲我們大量的數據,所以我們就需要掌握移動設備上的SQLite開發技巧
SQLiteDatabase類為我們提供了很多種方法,上面的代碼中基本上囊括了大部分的數據庫操作;對於添加、更新和刪除來說,我們都可以使用
1 db.executeSQL(String sql); 2 db.executeSQL(String sql, Object[] bindArgs);//sql語句中使用占位符,然後第二個參數是實際的參數集
除了統一的形式之外,他們還有各自的操作方法:
1 db.insert(String table, String nullColumnHack, ContentValues values); 2 db.update(String table, Contentvalues values, String whereClause, String whereArgs); 3 db.delete(String table, String whereClause, String whereArgs);
以上三個方法的第一個參數都是表示要操作的表名;insert中的第二個參數表示如果插入的數據每一列都為空的話,需要指定此行中某一列的名稱,系統將此列設置為NULL,不至於出現錯誤;insert中的第三個參數是ContentValues類型的變量,是鍵值對組成的Map,key代表列名,value代表該列要插入的值;update的第二個參數也很類似,只不過它是更新該字段key為最新的value值,第三個參數whereClause表示WHERE表達式,比如“age > ? and age < ?”等,最後的whereArgs參數是占位符的實際參數值;delete方法的參數也是一樣
下面給出demo
數據的添加
1.使用insert方法
ContentValues cv = new ContentValues();//實例化一個ContentValues用來裝載待插入的數據 cv.put("title","you are beautiful");//添加title cv.put("weather","sun"); //添加weather cv.put("context","xxxx"); //添加context String publish = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format(new Date()); cv.put("publish ",publish); //添加publish db.insert("diary",null,cv);//執行插入操作2.使用execSQL方式來實現
String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL語句 db.execSQL(sql);//執行SQL語句
數據的刪除
同樣有2種方式可以實現
String whereClause = "username=?";//刪除的條件 String[] whereArgs = {"Jack Johnson"};//刪除的條件參數 db.delete("user",whereClause,whereArgs);//執行刪除
String sql = "delete from user where username='Jack Johnson'";//刪除操作的SQL語句 db.execSQL(sql);//執行刪除操作
上面幾種都是常用的查詢方法,第一種最為簡單,將所有的SQL語句都組織到一個字符串中,使用占位符代替實際參數,selectionArgs就是占位符實際參數集;
各參數說明:
最後,他們同時返回一個Cursor對象,代表數據集的游標,有點類似於JavaSE中的ResultSet。下面是Cursor對象的常用方法:
c.move(int offset); //以當前位置為參考,移動到指定行 c.moveToFirst(); //移動到第一行 c.moveToLast(); //移動到最後一行 c.moveToPosition(int position); //移動到指定行 c.moveToPrevious(); //移動到前一行 c.moveToNext(); //移動到下一行 c.isFirst(); //是否指向第一條 c.isLast(); //是否指向最後一條 c.isBeforeFirst(); //是否指向第一條之前 c.isAfterLast(); //是否指向最後一條之後 c.isNull(int columnIndex); //指定列是否為空(列基數為0) c.isClosed(); //游標是否已關閉 c.getCount(); //總數據項數 c.getPosition(); //返回當前游標所指向的行數 c.getColumnIndex(String columnName);//返回某列名對應的列索引值 c.getString(int columnIndex); //返回當前行指定列的值未完待續...........
1、AIDL:Android Interface Definition Language,即Android接口定義語言。 Android
如果實現上下或者左右翻頁效果,我們借助下這個開源項目:https://github.com/openaphid/android-flip Aphid FlipView是一
MavLink是輕量級的通訊協議,主要應用於終端與小型無人載具間的通訊。由於它的通用性,MavLink可以被翻譯成各種語言的代碼應用於各種不同的環境。具體如何通過工具來生
ListView 控件可使用四種不同視圖顯示項目。通過此控件,可將項目組成帶有或不帶有列標頭的列,並顯示伴隨的圖標和文本。最近在網上看到時間軸的布局效果,嘗試按照這個原理