編輯:關於Android編程
下面詳細解釋這四大方式的特點
核心原理: 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():返回該應用數據文件夾的全部文件
實例:
核心代碼:
布局:
filename:
private String filename="info.txt";
保存:
public void mybtn1(View view) { // TODO Auto-generated method stub String Name=name.getText().toString(); String Pwd=pwd.getText().toString(); try { //字節文件輸出流是用於將數據寫入到File FileOutputStream fos=openFileOutput(filename, MODE_APPEND); PrintWriter out=new PrintWriter(fos); out.println(Name); out.println(Pwd); out.flush(); try { fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } out.close(); name.setText(""); pwd.setText(""); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }讀取:
public void mybtn2(View view) { // TODO Auto-generated method stub try { FileInputStream fis=openFileInput(filename); //字節轉換成字符流,再轉換為緩沖字符流 BufferedReader br=new BufferedReader(new InputStreamReader(fis)); String line=null; StringBuilder sb=new StringBuilder(); try { while((line=br.readLine())!=null){ sb.append(line+"\n"); tv.setText(sb.toString()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
其中讀寫步驟按如下進行:
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 String filename="my.txt";
public void mybtn1(View view) { // TODO Auto-generated method stub String Name=name.getText().toString(); String Pwd=pwd.getText().toString(); //1.判斷SD可用否 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //2.獲取路徑 String path=Environment.getExternalStorageDirectory().getAbsolutePath(); //3.獲取流對象進行讀寫操作 try { PrintWriter out=new PrintWriter(new FileOutputStream(path+"/"+filename)); out.println(Name); out.println(Pwd); out.flush(); name.setText(""); pwd.setText(""); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ Toast.makeText(this, "SD卡不可用", 0).show(); } }
public void mybtn2(View view) { // TODO Auto-generated method stub if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //2. String path=Environment.getExternalStorageDirectory().getAbsolutePath(); //3. try { BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(path+"/"+filename))); String line=null; StringBuilder sb=new StringBuilder(); try { while((line=br.readLine())!=null){ sb.append(line+"\n"); tv.setText(sb.toString()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } name.setText(""); pwd.setText(""); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else{ Toast.makeText(this, "SD卡不可用", 0).show(); } }效果圖: 第三種:Shared Preferences存儲數據
適用范圍:保存少量的數據,且這些數據的格式非常簡單:字符串型、基本類型的值。比如應用程序的各種配置信息(如是否打開音效、是否使用震動效果、小游戲的玩家積分等),解鎖口 令密碼等
核心原理:保存基於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編輯完成後,使用該方法提交修改
實例: 布局:用上面第一種的代碼 activity中: 保存:public void mybtn1(View view){ String Name=name.getText().toString(); String Pwd=pwd.getText().toString(); editor.putString("name", Name); editor.putString("pwd", Pwd); editor.putInt("count", 100); editor.putBoolean("sound", true); //提供修改之後的數據 editor.commit(); name.setText(""); pwd.setText(""); }
public void mybtn2(View view){ String n=sp.getString("name", ""); String p=sp.getString("pwd", ""); int c=sp.getInt("count", 0); boolean b=sp.getBoolean("sound", false); tv.setText("姓名:"+n+"\n"+"密碼:"+p+"\n"+"次數:"+c+"\n"+"sound:"+b+"\n"); }
SQLite是輕量級嵌入式數據庫引擎,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。現在的主流移動設備像Android、iPhone等都使用SQLite作為復雜數據的存儲引擎,在我們為移動設備開發應用程序時,也許就要使用到SQLite來存儲我們大量的數據,所以我們就需要掌握移動設備上的SQLite開發技巧
SQLiteDatabase類為我們提供了很多種方法,上面的代碼中基本上囊括了大部分的數據庫操作,現在我寫了數據庫幫助類實現了數據庫的創建和更新
實例:
布局:
activity:
package com.example.fileapp; import android.os.Bundle; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.EditText; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.TextView; public class FourActivity extends Activity { private EditText nameEt,pwdEt; private ListView lv; private MyOpenHelper helper; //代表數據庫對象 private SQLiteDatabase db; public void mybtn1(View view){ String name=nameEt.getText().toString(); String pwd=pwdEt.getText().toString(); //try { insert(db,name,pwd); //} catch (Exception e) { // create(db); // insert(db,name,pwd); //} } private void create(SQLiteDatabase db) { String sql="create table s_user(_id integer primary key autoincrement,name text,pwd text)"; db.execSQL(sql); } public void insert(SQLiteDatabase db,String name,String pwd){ /*String sql="insert into s_user("+"name,pwd)values(?,?)"; db.execSQL(sql,new String[]{name,pwd});*/ //使用特定的方法:insert ContentValues values=new ContentValues(); //key是字段名,value是插入的名字 values.put("name", name); values.put("pwd", pwd); db.insert("s_user", null, values); nameEt.setText(""); pwdEt.setText(""); } public void mybtn2(View view){ /*String sql="select * from s_user"; Cursor cursor=db.rawQuery(sql, null); */ //使用特定的方法 // Cursor cursor=db.query("s_user", null,null,null,null,null,null); refresh(cursor); } private void refresh(Cursor cursor){ SimpleCursorAdapter adapter=new SimpleCursorAdapter( this, R.layout.activity_item, cursor, new String[]{"_id","name","pwd"}, new int[]{R.id.id,R.id.name,R.id.pwd}, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); lv.setAdapter(adapter); } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_four); nameEt=(EditText)findViewById(R.id.name); pwdEt=(EditText)findViewById(R.id.pwd); lv=(ListView)findViewById(R.id.lv); lv.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { // TODO Auto-generated method stub TextView tv=(TextView) view.findViewById(R.id.id); String pid=tv.getText().toString(); /*String sql= "delete from s_user where _id="+pid; db.execSQL(sql);*/ //使用特定方法 db.delete("s_user", "_id=?", new String[]{pid}); refresh(db.rawQuery("select *from s_user", null)); return true; } }); //第一種方式:獲取數據庫對象 //第一個參數:數據庫文件的路徑 //第二個參數:游標的工廠對象 //db=SQLiteDatabase.openOrCreateDatabase(getFilesDir()+"/my.db", null); //第二種方式:獲取數據庫對象(方式更好) helper=new MyOpenHelper(this, "user.db", null, 1); db=helper.getReadableDatabase(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //關閉數據庫 helper.close(); } }
幫助類MyOpenHelper:
package com.example.fileapp; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; //數據庫的幫助類:創建數據庫表和數據庫的更新 public class MyOpenHelper extends SQLiteOpenHelper{ //定義該程序中每張表的建表語句 private String sql1="create table s_user(_id integer primary key autoincrement,name,pwd)"; //第二個參數是數據庫的名字,第三個是游標工廠對象,第四個是參數當前數據庫使用版本號 public MyOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } //用於創建數據庫表,第一次創建數據庫文件時被回調 @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL(sql1); } //用於數據庫的更新,舊版本號和新版本號不一致會被回調 @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } }
效果圖:
要使用MD風格控件,首先需要在Gradle中加入Support Design Library,例如:compile com.android.support:design:
推薦閱讀:淺析Android手機衛士自定義控件的屬性淺析Android手機衛士關閉自動更新詳解Android 手機衛士設置向導頁面一般的手機沒有root權限,進不去dat
??Android實現天氣預報溫度/氣溫折線趨勢圖天氣預報的APP應用中,難免會遇到繪制天氣溫度/氣溫,等關於數據趨勢的折線或者曲線圖,這類關於氣溫/溫度的折線圖,一般會
人物移動地圖的平滑滾動處理 玩過rpg游戲的朋友應該都知道RPG的游戲地圖一般都比較大 今天我和大家分享一下在RPG游戲