編輯:關於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
}
}
效果圖:

總結Android中MD風格相關控件
要使用MD風格控件,首先需要在Gradle中加入Support Design Library,例如:compile com.android.support:design:
深入淺析Android手機衛士保存密碼時進行md5加密
推薦閱讀:淺析Android手機衛士自定義控件的屬性淺析Android手機衛士關閉自動更新詳解Android 手機衛士設置向導頁面一般的手機沒有root權限,進不去dat
Android實現天氣預報溫度/氣溫折線趨勢圖
??Android實現天氣預報溫度/氣溫折線趨勢圖天氣預報的APP應用中,難免會遇到繪制天氣溫度/氣溫,等關於數據趨勢的折線或者曲線圖,這類關於氣溫/溫度的折線圖,一般會
Android研究之游戲開發主角與地圖的滾動
人物移動地圖的平滑滾動處理 玩過rpg游戲的朋友應該都知道RPG的游戲地圖一般都比較大 今天我和大家分享一下在RPG游戲