Android四種存儲方式: sharedpreference,file,SQlite,contentprovider。
成都創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)龍州,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
1、SharedPreferences是一種輕型的數(shù)據(jù)存儲方式,它的本質(zhì)是基于XML文件存儲key-value鍵值對數(shù)據(jù),通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/包名/shared_prefs目錄下。SharedPreferences對象本身只能獲取數(shù)據(jù)而不支持存儲和修改,存儲修改是通過Editor對象實(shí)現(xiàn)。實(shí)現(xiàn)SharedPreferences存儲的步驟如下:
一、根據(jù)Context獲取SharedPreferences對象
二、利用edit()方法獲取Editor對象。
三、通過Editor對象存儲key-value鍵值對數(shù)據(jù)。
四、通過commit()方法提交數(shù)據(jù)。
具體實(shí)現(xiàn)代碼如下:實(shí)現(xiàn)存儲,讀取,清除,刪除
效果圖:
首先創(chuàng)建:// 首先拿到sharedpreference對象
mShared =getSharedPreferences(SHARED_MAIN_XML, MODE_PRIVATE);
存儲:
private void write() {// 存入數(shù)據(jù)
savename = name.getText().toString().trim();
saveage = Integer.valueOf(age.getText().toString().trim());
Editor editor = mShared.edit();
editor.putString("name", savename);
editor.putInt("age", saveage);
// 保證操作的事務(wù)完整性
editor.commit();
}
閱讀:
private String read() {// 從數(shù)據(jù)庫里讀取數(shù)據(jù)
namecontent = mShared.getString("name", "數(shù)據(jù)庫里沒有存儲姓名");
agecontent = mShared.getInt("age", 0);
String reading = "姓名:" + namecontent + "\n年齡:" + agecontent;
return reading;
}
清除內(nèi)容:
private void clear() {//清除內(nèi)容
/** 開始清除SharedPreferences中保存的內(nèi)容 **/
Editor editor = mShared.edit();
editor.remove("name");
editor.remove("age");
editor.commit();
}
刪除文件:
private void delete() {//刪除文件
/** 刪除SharedPreferences文件 **/
Filefile = new File("/data/data/cn.csdn.activity" + "/shared_prefs/"
+ SHARED_MAIN_XML + ".xml");
if (file.exists()) {
file.delete();
Toast.makeText(this, "刪除成功", Toast.LENGTH_LONG).show();
}
}
haredPreferences對象與SQLite數(shù)據(jù)庫相比,免去了創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數(shù)據(jù)類型,比如其無法進(jìn)行條件查詢等。所以不論SharedPreferences的數(shù)據(jù)存儲操作是如何簡單,它也只能是存儲方式的一種補(bǔ)充,而無法完全替代如SQLite數(shù)據(jù)庫這樣的其他數(shù)據(jù)存儲方式。
2、 File: 即常說的文件(I/O)存儲方法,常用存儲大數(shù)量的數(shù)據(jù),但是缺點(diǎn)是更新數(shù)據(jù)將是一件困難的事情。
下面實(shí)現(xiàn):在本地data文件下使用自己生成的文件處理數(shù)據(jù)的新建儲存 讀取 刪除
如果說不想把內(nèi)容存在SharedPreferences中的話,我們可以自己寫一個(gè)文件保存須要的數(shù)據(jù),在這里我將文件保存在系統(tǒng)中的工程路徑下。
跟上面布局一樣,刪除文件也一樣,清除內(nèi)容也查不多,下面只是簡單的寫和讀的方法:
寫:
17String
nameage="名字:"+name.getText().toString().trim()+"年齡:"+age.getText().toString();
try {
os = this.openFileOutput(SHARED_MAIN_XML, MODE_PRIVATE);
/* 把字符串轉(zhuǎn)換成字節(jié)數(shù)組,寫入文件中 */
os.write(nameage.getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
/* 關(guān)閉文件輸出流 */
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
讀:
private String read() {
String nameage="";
// 打開文件輸入流,
try {
is = this.openFileInput(SHARED_MAIN_XML);
/* 初始化字節(jié)數(shù)組 */
b = new byte[1024];
/* 從文件輸入流中讀取內(nèi)容到字節(jié)數(shù)組中,返回內(nèi)容長度 */
int length = is.read(b);
/* 把字節(jié)數(shù)組轉(zhuǎn)換成字符串 */
nameage= new String(b);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return nameage;
}
很簡單吧!!
3、 SQLite是一種轉(zhuǎn)為嵌入式設(shè)備設(shè)計(jì)的輕型數(shù)據(jù)庫,其只有五種數(shù)據(jù)類型,分別是:
NULL: 空值
INTEGER: 整數(shù)
REAL: 浮點(diǎn)數(shù)
TEXT: 字符串
BLOB: 大數(shù)據(jù)
它是一個(gè)輕量級的數(shù)據(jù)庫、非常小 、 移植性好、效率高、可靠
在Android系統(tǒng)中提供了android.database.sqlite包,用于進(jìn)行SQLite數(shù)據(jù)庫的增、刪、改、查工作。
創(chuàng)建與刪除數(shù)據(jù)庫
封裝一個(gè)類去繼承SQLiteOpenHelper
在構(gòu)造函數(shù)中傳入數(shù)據(jù)庫名稱與數(shù)據(jù)庫版本號,數(shù)據(jù)庫被創(chuàng)建的時(shí)候會調(diào)用onCreate(SQLiteDatabase db)
方法,數(shù)據(jù)庫版本號發(fā)生改變的時(shí)候會調(diào)用onUpgrade(SQLiteDatabase db, int oldVersion,
intnewVersion)方法,可以方便的對軟件游戲升級后做出相應(yīng)處理避免覆蓋安裝數(shù)據(jù)庫發(fā)生改變產(chǎn)生的錯(cuò)誤。調(diào)用SQLiteOpenHelper
的getReadableDatabase()方法去創(chuàng)建數(shù)據(jù)庫,如果數(shù)據(jù)庫不存在則創(chuàng)建并且返回SQLiteDatabase對象,如果數(shù)據(jù)庫存在則不創(chuàng)建只返回SQLiteDatabase對象。調(diào)用
deleteDatabase(DATABASE_NAME)方法 傳入數(shù)據(jù)庫名稱則可刪除數(shù)據(jù)庫。
第一種:詳細(xì)請看上一遍博客:android之利用SQLite數(shù)據(jù)庫實(shí)現(xiàn)登陸和注冊,
下面介紹第二種:另一種添刪改查操作
效果圖:
布局文件很簡單,在此不再給出!!
直接給創(chuàng)建數(shù)據(jù)庫和表,增刪改查的代碼:
public class UserService {
private DatabaseHelper helper;
public UserService(Context context, String name, int version) {
helper = new DatabaseHelper(context, name, version);
}
public UserService(Context context, String name) {
helper = new DatabaseHelper(context, name);
}
public void insert(UserDao user) {// 插入數(shù)據(jù)
SQLiteDatabase sdb = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", user.getUsername());
values.put("password", user.getPassword());
sdb.insert("user", "name", values);
sdb.close();
}
public void delete(int id) {// 刪除數(shù)據(jù)
SQLiteDatabase sdb = helper.getWritableDatabase();
sdb.delete("user", "id=?", new String[]{String.valueOf(id)});
sdb.close();
}
public void update(UserDao user, int id) {// 更新數(shù)據(jù)
SQLiteDatabase sdb = helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("username", user.getUsername());
values.put("password", user.getPassword());
sdb.update("user", values, "id=?", new String[]{String.valueOf(id)});
sdb.close();
}
public Cursor select() {// 查詢所有數(shù)據(jù)
SQLiteDatabase sdb = helper.getWritableDatabase();
return sdb.query("user", new String[]{"id as _id","username","password"},
null, null, null, null, null);
}
public UserDao find(int id){//按id查詢數(shù)據(jù)
UserDao user=null;
SQLiteDatabase sdb=helper.getWritableDatabase();
Cursor cursor=sdb.query("user", new String[]{"id","username","password"},
"id=?", new String[]{String.valueOf(id)}, null, null, null);
if(cursor.moveToFirst()){
user=new UserDao();
user.setId(cursor.getInt(0));
user.setUsername(cursor.getString(1));
user.setPassword(cursor.getString(2));
}
cursor.close();
sdb.close();
return user;
}
}
插入數(shù)據(jù):通過insert(String table, StringnullColumnHack, ContentValues
values)方法插入數(shù)據(jù),其中參數(shù)含義分別為:
table: 目標(biāo)表名
nullColumnHack:
指定表中的某列列名。因?yàn)樵赟QLite中,不允許不允許插入所有列均為null的記錄,因此初始值有值為空時(shí),此列需顯式賦予null
values:ContentValues對象,類似于java中的Map。以鍵值對的方式保存數(shù)據(jù)。
創(chuàng)建全局變量
在onCreate方法里面設(shè)置點(diǎn)擊事件
先判斷Android版本是否低于7.0,再根據(jù)判斷結(jié)果選擇不同的方式創(chuàng)建Uri(因?yàn)榘沧?.0后直接使用本地真實(shí)路徑被認(rèn)為是不安全的)
FileProvider是contentProvider
系統(tǒng)會找出能響應(yīng)這個(gè)Intent的Activity,即相機(jī),在通過startActivityForResult得到拍攝結(jié)果
1.定義全局變量fromAlbum
2.添加點(diǎn)擊事件
3.修改onActivityResult方法
(音頻文件放在assets文件夾下)
(視頻文件放在raw文件夾下)
Android開發(fā)中,常常需要獲取本地或者網(wǎng)絡(luò)多媒體的一些基本信息。MediaMetadataRetriever類位于android.media包下,提供了用于從輸入媒體文件檢索幀和元數(shù)據(jù)的統(tǒng)一接口,可以很方便實(shí)現(xiàn)這些功能。
本例中提供了獲取本地視頻和網(wǎng)絡(luò)視頻第一幀圖片的功能,首先初始化MediaMetadataRetriever,如果是本地視頻設(shè)置數(shù)據(jù)源時(shí)通過 Uri.fromFile()轉(zhuǎn)化為Uri對象,再通過MediaMetadataRetriever的getFrameAtTime()方法默認(rèn)獲取第一幀圖片。如果是網(wǎng)絡(luò)視頻直接將url設(shè)置為數(shù)據(jù)源即可。
在實(shí)際的開發(fā)中,關(guān)于音頻的傳輸上,iOS與Android的通用性一直是一個(gè)不可回避的問題。下面記錄下比較好的解決方案。
對于這個(gè)解決方法一定要提醒一下,不是把文件的格式名稱修改為 .mp3 就OK的,一定要是 mp3點(diǎn)編碼格式,遇到過一個(gè)安卓開發(fā)人員 文件的輸出格式是 3pg
而文件的格式后綴是 .mp3,結(jié)果iOS這邊一直無法播放,而且打開把該文件在服務(wù)器上的路徑粘到瀏覽器中也是無法識別和播放的。
.amr 格式的蘋果這邊也是無法播放的。
mpeg_4 輸出格式的文件蘋果這邊也是無法播放的。
兩邊都使用 libmp3lame 進(jìn)行編碼不會出現(xiàn)問題,也有些同學(xué)反應(yīng) 安卓那邊無法把pcm 格式的音頻文件轉(zhuǎn)化為 mp3 格式的,我只想說可以使用 libmp3lame 試試,網(wǎng)上能找到資源
由于安卓那邊的錄音默認(rèn)的保存格式就是 amr,而蘋果這邊也可以把音頻文件輸出為 wav格式進(jìn)行保存,所有只要 iOS端 Wav文件 轉(zhuǎn) amr 格式給安卓使用,把安卓的amr 文件轉(zhuǎn)化為 wav格式 給自己使用即可解決iOS與Android的音頻文件互通問題。
關(guān)于iOS與Android的視頻文件互通的問題,MP4格式的即可解決。
關(guān)于wav和amr 格式互轉(zhuǎn),可以參考這個(gè)dome,喜歡請 star一下
布局文件
Activity
Activity
Activity
Android中SurfaceView的使用詳解
Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
Android TextureView簡易教程
END
分享文章:android多媒體,Android多媒體 pdf
文章地址:http://jinyejixie.com/article16/dssicdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站排名、網(wǎng)站建設(shè)、云服務(wù)器、標(biāo)簽優(yōu)化、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)