Android的數(shù)據(jù)存儲方式
前言:隨著Android的興起娃惯,Android為更多的開發(fā)者所青睞皆撩,隨之伴隨著一些問題捍壤。有開發(fā)平臺不同槽畔,個體中問題處理方法也是不同的洪灯,今天我們來講解一下Android的這五種數(shù)據(jù)存儲方式,一來方便自己查閱竟痰、復(fù)習(xí)和鞏固基石签钩,而來也能解開大家心中 的疑惑,OK坏快,讓我們走起铅檩!
常識知識普及:
RAM :內(nèi)存 運行內(nèi)存
ROM : 內(nèi)部存儲空間 相當(dāng)于固態(tài)硬盤
SD卡 : 外部存儲卡
1)內(nèi)部存儲
-cache : 存儲臨時數(shù)據(jù)(當(dāng)系統(tǒng)容量不足時會自動刪除文件夾中的數(shù)據(jù))
this.getCacheDir();能夠獲取cache的文件夾路徑
-files : Android系統(tǒng)不會刪除這個目錄下的文件
this.getFilesDir();能夠獲取files文件夾路徑
//獲取files目錄下的savedata.text文件的輸出流(寫入)
openFileOutput("savedata.txt",0);
//獲取files目錄下的savedata.text文件的輸入流(讀取)
openFileInput("savedata.txt");
-路徑 : /data/data/包名。莽鸿。昧旨。/
2)外部存儲
-路徑 : /mnt/sdcard/
-獲取路徑系統(tǒng)API :
//無論任何Android廠商獲取的都是sd卡的地址
File file = Environment.getExternalStorageDirectory();
String filePath = filess.getAbsolutePath();
-獲取SD卡的狀態(tài) :
String sdCardState = Environment.getExternalStorageState();
if(sdCardState.equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(this, "sd卡已插入", 0).show();
}else if(sdCardState.equals(Environment.MEDIA_UNMOUNTED)) {
Toast.makeText(this, "sd卡拔出", 0).show();
}
-獲取SD卡可用空間大小 :
File file = Environment.getExternalStorageDirectory();
//獲取可用空間大小 byte類型
long freeSpace = filess.getFreeSpace();
//格式化空間大小 B KB MB GB TB
String formatFileSize = Formatter.formatFileSize(this, freeSpace);
3)SharedPrefrence存儲
-路徑 : /data/data/包名/shared_prefs/
-應(yīng)用場景 : 用來存儲配置信息
-存儲 :
1)初始化SharedPreferences對象 "config"表示存儲的文件名
SharedPreferences sp = getSharedPreferences("config", 0);//初始化sp對象
>2)拿到編輯器
Editor edit = sp.edit();
>3)存儲數(shù)據(jù)
edit.putBoolean("status", status);//第一個參數(shù)是狀態(tài)名 第二個參數(shù)是狀態(tài)值
>4)提交(重要)
edit.commit();
>-**讀取** :
sp.getBoolean("status", false);//第一個參數(shù)是狀態(tài)名 第二個參數(shù)是默認(rèn)值
> **注意:保存的時候會自動添加后綴名 .xml (config.xml)**
4)網(wǎng)絡(luò)存儲(重要)
應(yīng)用場景:比如頭像拾给、價格。兔沃。蒋得。都會存儲在網(wǎng)絡(luò)服務(wù)器之上
網(wǎng)絡(luò)存儲比較重要也相對復(fù)雜會單獨用一章進行講解
5)數(shù)據(jù)庫存儲(重要)
《Android基礎(chǔ)》------3.SqLite數(shù)據(jù)庫的使用詳解
Sqlite數(shù)據(jù)庫
- 開源的
- 輕量的
- sql的增刪改查語句和mysql很像
數(shù)據(jù)庫的創(chuàng)建
- java在硬盤上創(chuàng)建文件 :
//在內(nèi)存中創(chuàng)建指向D盤的文件對象
File file=new File("D://data.txt");
//用file對象在硬盤上創(chuàng)建一個文件
FileOutputStream fos=new FileOutputStream(file);
fos.write("hello".getBytes());
fos.close();
**Android在手機上創(chuàng)建數(shù)據(jù)庫文件** :
1)在內(nèi)存中創(chuàng)建數(shù)據(jù)庫幫助類對象
2)用數(shù)據(jù)庫對象去創(chuàng)建文件
路徑:/data/data/包名/databases/
- 第一次創(chuàng)建數(shù)據(jù)庫的時候會調(diào)用 onCreate();
這方法值調(diào)用一次 比較適合用于創(chuàng)建收庫的表
// 創(chuàng)建數(shù)據(jù)庫的表
db.execSQL("create table stu(_id integer primary key autoincrement,name varcher(20),num varcher(20))");
- //在升級的時候修改表 onUpgrade();
db.execSQL("alter table stu add stopdate varcher(20)");
- 數(shù)據(jù)庫升級(注意事項)
數(shù)據(jù)庫的版本升級時調(diào)用
version遞增 不能降級
數(shù)據(jù)庫的創(chuàng)建:
//在內(nèi)存中創(chuàng)建數(shù)據(jù)庫對象 使用數(shù)據(jù)庫幫助類進行創(chuàng)建
MyDbOpenHelper dbHelper = new MyDbOpenHelper(this);
//創(chuàng)建一個可寫入的數(shù)據(jù)庫
dbHelper.getWritableDatabase();
數(shù)據(jù)庫幫助類:
package yingxininfo.net.netidcard.data;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class MyDbOpenHelper extends SQLiteOpenHelper {
private static final String Tag = "MyDbOpenHelper";
/**
*
* @param context
* 上下文
* @param name
* 數(shù)據(jù)庫名稱
* @param factory
* 游標(biāo)(null用默認(rèn)的游標(biāo)工廠)
* @param version
* 數(shù)據(jù)庫版本 >=1的整數(shù)
*/
public MyDbOpenHelper(Context context) {
super(context, "student.db", null, 1);
// TODO Auto-generated constructor stub
Log.i(Tag, "數(shù)據(jù)庫幫助類對象創(chuàng)建");
}
/**
* 只在第一次創(chuàng)建數(shù)據(jù)庫的時候調(diào)用
* 比較適合用來創(chuàng)建數(shù)據(jù)庫的表
*/
@Override
public void onCreate(SQLiteDatabase db) {
//
Log.i(Tag, "onCreate方法被調(diào)用了!");
// 創(chuàng)建數(shù)據(jù)庫的表
db.execSQL("create table stu(_id integer primary key autoincrement,name varcher(20),num varcher(20))");
Log.i(Tag, "數(shù)據(jù)庫表創(chuàng)建成功乒疏!");
}
/**
* 數(shù)據(jù)庫的版本升級時調(diào)用 數(shù)據(jù)庫只可升級不可降級 升級時能夠修改表結(jié)構(gòu)
*/
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
Log.i(Tag, "onUpgrade方法被調(diào)用了,數(shù)據(jù)庫版本升級了");
}
}
數(shù)據(jù)庫的增刪改查
-增加
insert into 表名 (‘字段名’....)values('字段名對應(yīng)的數(shù)據(jù)'....)
例子:insert into stu ('name','num','startdate','stopdate')
values('risingsun','123456789011111111','20220211','20660211')
-查詢 select * from 表名 查詢表中所有的數(shù)據(jù)
select * from stu
-修改 update 表名 set 字段名=“” where 字段名=“”
update stu set name='happy' where _id=4 把_id為4的 數(shù)據(jù)的名字改為‘happy’
-刪除 delete form 表名 where 字段=“”
delete FROM stu WHERE _id=3 刪除表中_id為3的一行數(shù)據(jù)
注意:寫這些操作數(shù)據(jù)庫的語句最好在可視化數(shù)據(jù)庫工具中編寫運行后再寫入我們的程序 能夠最大程度的防止sql語句出錯 切記
Android下文件訪問權(quán)限(非常重要)
-原理:使用的是Linux系統(tǒng)文件的權(quán)限
默認(rèn)情況下:Android應(yīng)用程序只能讀取自己的應(yīng)用數(shù)據(jù)不能讀取別的應(yīng)用程序的數(shù)據(jù)
- rw- rw- ---
第一位表示: 文件的類型 d:表示文件夾 - :表示文件
前三位表示: 當(dāng)前用戶的權(quán)限
中間三位表示:當(dāng)前用戶所在的組的權(quán)限
最后三位表示: 其他用戶
r:讀榷钛谩(read)
w:寫入(write)
四中常見的文件格式
1)只讀
openFileOutput("private.txt", MODE_WORLD_READABLE);//MODE_WORLD_READABLE==1 只讀
2)只寫
openFileOutput("readable.txt", MODE_WORLD_WRITEABLE);//MODE_WORLD_WRITEABLE
3)可讀可寫
openFileOutput("writeable.txt", MODE_WORLD_READABLE+MODE_WORLD_WRITEABLE);//表示可讀可寫
4)私有
openFileOutput("publicable.txt", MODE_PRIVATE);//MODE_PRIVATE==0 表示私有 只有自己可以訪問