




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
SQLite數(shù)據(jù)庫(kù)相關(guān)的類與接口,相關(guān)的方法及編程訪問SD卡簡(jiǎn)介訪問SD卡常用方法及常量,權(quán)限設(shè)置SharedPreferences存儲(chǔ)SharedPreferences接口,應(yīng)用案例目錄CONTENTS010203文件存儲(chǔ)文件存儲(chǔ)常見類04數(shù)據(jù)存儲(chǔ)第9章ContentProvider實(shí)現(xiàn)數(shù)據(jù)共享的相關(guān)類、接口與權(quán)限05SharedPreferences存儲(chǔ)PART.01SharedPreferences存儲(chǔ)SharedPreferences提供了一種輕量級(jí)的數(shù)據(jù)存取方法,一般用于數(shù)據(jù)較少的配置信息的存儲(chǔ)場(chǎng)合。SharedPreferences存儲(chǔ)是以“鍵-值”對(duì)的方式將數(shù)據(jù)保存到一個(gè)內(nèi)部的XML配置文件中。保存SharedPreferences鍵值對(duì)信息的文件存放在/data/data/<packagename>/shared_prefs下。<packagename>即應(yīng)用項(xiàng)目包名。必須先啟動(dòng)AndroidStudio的模擬器,然后單擊AndroidStudio編輯窗右下角的DeviceFileExplorer標(biāo)簽,才能看到DeviceFileExplorer區(qū)域中的內(nèi)容。SharedPreferencesSharedPreferences存儲(chǔ)SharedPreferences是一個(gè)接口,位于android.content.SharedPreferences包中。獲取SharedPreferences對(duì)象的兩種方式調(diào)用Context對(duì)象的getSharedPreferences()方法,所獲得的SharedPreferences對(duì)象可以被同一應(yīng)用項(xiàng)目下的其他組件共享。getSharedPreferences()方法的語(yǔ)法:Context.getSharedPreferences(Stringname,intmode);Mode指操作模式:MODE_PRIVATE,值為0,應(yīng)用項(xiàng)目私有,常用;MODE_WORLD_READABLE,值為1,其他程序可讀;MODE_WORLD_WRITEABLE,值為2,其他程序可寫。調(diào)用Activity對(duì)象的getPreferences()方法,獲得的SharedPreferences對(duì)象只能在該Activity中使用。獲取SharedPreferences對(duì)象SharedPreferences存儲(chǔ)使用SharedPreferences對(duì)象存儲(chǔ)數(shù)據(jù)時(shí),還需要使用SharedPreferences的一個(gè)內(nèi)部接口SharedPreferences.Editor。SharedPreferences對(duì)象獲取數(shù)據(jù)方法說(shuō)明edit()返回SharedPreferences的內(nèi)部接口SharedPreferences.Editorcontains(Stringkey)判斷是否包含該鍵值getAll()從SharedPreferences中返回所有的信息getBoolean(Stringkey,booleandefValue)獲得一個(gè)boolean值getFloat(Stringkey,floatdefValue)獲得一個(gè)float值getInt(Stringkey,intdefValue)獲得一個(gè)int值getLong(Stringkey,longdefValue)獲得一個(gè)long值getString(Stringkey,StringdefValue)獲得一個(gè)String值SharedPreferences存儲(chǔ)調(diào)用SharedPreferences的edit()方法返回SharedPreferences.Editor內(nèi)部接口,該接口中提供了保存數(shù)據(jù)的方法。SharedPreferences對(duì)象獲取數(shù)據(jù)方法說(shuō)明clear()清空SharedPreferences里的所有數(shù)據(jù)commit()當(dāng)Editor編輯完成后,提交修改到SharedPreferences的XML配置文件中putBoolean(Stringkey,booleanvalue)保存一個(gè)boolean值putFloat(Stringkey,floatvalue)保存一個(gè)float值putInt(Stringkey,intvalue)保存一個(gè)int值putLong(Stringkey,longvalue)保存一個(gè)long值putString(Stringkey,Stringvalue)保存一個(gè)String值remove(Stringkey)刪除SharedPreferences里指定key對(duì)應(yīng)的數(shù)據(jù)項(xiàng)SharedPreferences存儲(chǔ)獲得SharedPreferences對(duì)象。使SharedPreferences對(duì)象處于編輯狀態(tài)。即調(diào)用SharedPreferences對(duì)象的edit()方法得到內(nèi)部接口SharedPreferences.Editor。保存鍵-值對(duì)。即使用相應(yīng)的put...()方法保存鍵-值對(duì)。例如保存字符串型使用putString()方法。調(diào)用commit()方法提交數(shù)據(jù),將鍵-值對(duì)數(shù)據(jù)寫入到SharedPreferences的XML配置文件中。SharedPreferences存儲(chǔ)的編程步驟SharedPreferences應(yīng)用案例設(shè)計(jì)思路使用SharedPreferences對(duì)賬號(hào)和密碼的輸入信息進(jìn)行存取。在Activity的構(gòu)造方法中讀XML配置文件,如果有保存的登錄信息則顯示在相應(yīng)位置;如果有勾選“記住我”,則在點(diǎn)擊“登錄”按鈕或退出Activity時(shí)寫入登錄信息到XML配置文件中。【案例9.1】在用戶登錄界面中,增加一個(gè)復(fù)選框“記住我”。當(dāng)勾選了該復(fù)選框后,系統(tǒng)的用戶登錄Activity將保存最近的一次用戶登錄信息。開發(fā)步驟準(zhǔn)備圖片資源。復(fù)制back.jpg作為背景圖片資源到本項(xiàng)目的res/drawable目錄中。準(zhǔn)備字符串資源。編寫res/values目錄下的strings.xml文件。準(zhǔn)備樣式資源。定義了<stylename=“button”>、<stylename=“title”>、<stylename=“text”>和<stylename=“content”>等樣式,用于文本的textColor、textColor和textStyle屬性。設(shè)計(jì)布局,在登錄界面內(nèi)添加一個(gè)CheckBox控件,用于用戶選擇是否記錄登錄信息。開發(fā)邏輯代碼。SharedPreferences應(yīng)用案例MainActivity.java代碼片段21protectedvoidonCreate(BundlesavedInstanceState){22super.onCreate(savedInstanceState);23setContentView(R.layout.activity_main);24etUid=(EditText)findViewById(R.id.etUid);25etPwd=(EditText)findViewById(R.id.etPwd);26cb=(CheckBox)findViewById(R.id.cbRemember);27checkIfRemember();//從SharedPreferences中讀取用戶的帳號(hào)和密碼29findViewById(R.id.btnLogin).setOnClickListener(newView.OnClickListener(){30@Override31publicvoidonClick(Viewv){32uidstr=etUid.getText().toString().trim();//獲得輸入的帳號(hào)33pwdstr=etPwd.getText().toString().trim();//獲得輸入的密碼34if(!uidstr.isEmpty()&&!pwdstr.isEmpty()&&cb.isChecked()){35rememberMe(uidstr,pwdstr);//存入SharedPreferences36}37//TODOsomethingforLogin38}39});}41@Override42protectedvoidonStop(){43super.onStop();44if(cb.isChecked()){45uidstr=etUid.getText().toString().trim();//獲得輸入的帳號(hào)46pwdstr=etPwd.getText().toString().trim();//獲得輸入的密碼47rememberMe(uidstr,pwdstr);//存入SharedPreferences48}49}50@Override51protectedvoidonDestroy(){52super.onDestroy();53}56publicvoidcheckIfRemember(){SharedPreferencessp=getSharedPreferences(SP_INFOS,MODE_PRIVATE);58uidstr=sp.getString(USERID,null);59pwdstr=sp.getString(PASSWORD,null);60if(uidstr!=null&&pwdstr!=null){61etUid.setText(uidstr);62etPwd.setText(pwdstr);63cb.setChecked(true);64}65}68publicvoidrememberMe(Stringuid,Stringpwd){SharedPreferencessp=getSharedPreferences(SP_INFOS,MODE_PRIVATE);70SharedPreferences.Editoreditor=sp.edit();//獲得Editor71editor.putString(USERID,uid);//將用戶的帳號(hào)存入Preferences72editor.putString(PASSWORD,pwd);//將密碼存入Preferences73mit();74}SharedPreferences應(yīng)用案例運(yùn)行結(jié)果(a)初始運(yùn)行界面(b)選中“記住我”,再次運(yùn)行界面SQLite數(shù)據(jù)庫(kù)PART.02SQLite數(shù)據(jù)庫(kù)Android平臺(tái)中內(nèi)嵌一個(gè)輕量級(jí)的、功能強(qiáng)大的嵌入式關(guān)系數(shù)據(jù)庫(kù)SQLite,使用方便,可以用于完成各種復(fù)雜的數(shù)據(jù)處理,實(shí)現(xiàn)結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)。SQLite數(shù)據(jù)庫(kù)文件包含所有數(shù)據(jù)庫(kù)和表,是一個(gè)單一的文件,擴(kuò)展名為db。存儲(chǔ)在項(xiàng)目目錄的/data/data/<packagename>/databases下。在AndroidStudio的DeviceFileExplorer中可查到。在默認(rèn)情況下,SQLite數(shù)據(jù)庫(kù)文件屬于應(yīng)用項(xiàng)目所私有,且數(shù)據(jù)庫(kù)的名字是唯一的。SQLiteSQLite數(shù)據(jù)庫(kù)SQLiteDatabase類SQLiteDatabase類位于android.database.sqlite.SQLiteDatabase包中,是SQLite的數(shù)據(jù)庫(kù)管理類。一個(gè)SQLiteDatabase對(duì)象代表一個(gè)數(shù)據(jù)庫(kù)。在Android平臺(tái)下,可以通過SQLiteDatabase類的靜態(tài)方法創(chuàng)建或打開數(shù)據(jù)庫(kù),以及對(duì)數(shù)據(jù)庫(kù)的記錄進(jìn)行增、刪、改、查等操作。SQLiteOpenHelper類SQLiteOpenHelper類位于android.database.sqlite.SQLiteOpenHelper包中,它是一個(gè)輔助類,主要用來(lái)管理數(shù)據(jù)庫(kù)的創(chuàng)建和版本。SQLiteOpenHelper是一個(gè)抽象類,使用時(shí)通常需要?jiǎng)?chuàng)建子類繼承它,并實(shí)現(xiàn)兩個(gè)抽象方法onCreate()和onUpgrade()。SQLite相關(guān)類與接口SQLite數(shù)據(jù)庫(kù)Cursor接口Cursor位于android.database.Cursor包中,它是Android的一個(gè)非常有用的游標(biāo)接口,通過Cursor可以對(duì)數(shù)據(jù)庫(kù)的查詢結(jié)果集進(jìn)行隨機(jī)的讀寫訪問。調(diào)用SQLiteDatabase的query和rawQuery方法時(shí),返回的都是Cursor對(duì)象,我們可以通過一條一條地查詢游標(biāo)的內(nèi)容來(lái)遍歷整個(gè)結(jié)果集。ContentValues類ContentValues類位于android.content.ContentValues包中,它存儲(chǔ)一些鍵-值對(duì),提供了數(shù)據(jù)庫(kù)表的列名、數(shù)據(jù)映射信息。ContentValues的鍵是一個(gè)String類型的數(shù)據(jù),對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的列名;而其相應(yīng)的值是一個(gè)基本數(shù)據(jù)類型的數(shù)據(jù),對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的數(shù)據(jù)。一個(gè)ContentValues對(duì)象代表數(shù)據(jù)庫(kù)表的一行數(shù)據(jù)。ContentValues主要用于記錄增加和更新操作。SQLite相關(guān)類與接口SQLite數(shù)據(jù)庫(kù)SQLiteDatabase中常用的方法。方法參數(shù)說(shuō)明openDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory,intflags)path:指定路徑的數(shù)據(jù)庫(kù)文件;factory:構(gòu)造查詢時(shí)返回的Cursor對(duì)象;flags:打開模式,模式參數(shù)包括:OPEN_READONLY、OPEN_READWRITE、CREATE_IF_NECESSARY打開或創(chuàng)建數(shù)據(jù)庫(kù)openOrCreateDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory)同上相當(dāng)于上面方法中第三個(gè)參數(shù)取CREATE_IF_NECESSARY的情形create(SQLiteDatabase.CursorFactoryfactory)同上創(chuàng)建一個(gè)內(nèi)存數(shù)據(jù)庫(kù)insert(Stringtable,StringnullColumnHack,ContentValuesvalues)table:數(shù)據(jù)表名稱;nullColumnHack:空列的默認(rèn)值;values:封裝了列名和列值的Map添加一條記錄delete(Stringtable,StringwhereClause,String[]whereArgs)table:數(shù)據(jù)表名稱whereClause:刪除條件whereArgs:刪除條件值數(shù)組刪除一條記錄update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)table:數(shù)據(jù)表名稱;values:更新列ContentValues類型鍵-值對(duì);whereClause:更新條件(即where子句);whereArgs:更新條件值數(shù)組修改記錄query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)table:數(shù)據(jù)表名稱;columns:列名數(shù)組;selection:條件子句,相當(dāng)于where;selectionArgs:條件子句,where的值數(shù)組;groupBy:分組的列名;having:分組條件;orderBy:排序的列名查詢記錄,其返回值為一個(gè)Cursor實(shí)例execSQL(Stringsql)sql:SQL語(yǔ)句執(zhí)行一條SQL語(yǔ)句close()
關(guān)閉數(shù)據(jù)庫(kù)SQLite數(shù)據(jù)庫(kù)SQLiteOpenHelper中常用的方法。方法說(shuō)明onCreate(SQLiteDatabasedb)創(chuàng)建數(shù)據(jù)庫(kù)時(shí)調(diào)用onUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)版本更新時(shí)調(diào)用getReadableDatabase()創(chuàng)建或打開一個(gè)只讀數(shù)據(jù)庫(kù)getWritableDatabase()創(chuàng)建或打開一個(gè)讀寫數(shù)據(jù)庫(kù)SQLite數(shù)據(jù)庫(kù)Cursor中常用的方法。方法說(shuō)明getCount()獲取游標(biāo)結(jié)果集的總記錄條數(shù)isFirst()判斷游標(biāo)是否是第一條記錄isLast()判斷游標(biāo)是否是最后一條記錄isClosed()判斷游標(biāo)結(jié)果集是否關(guān)閉move(intoffset)向后移動(dòng)游標(biāo)到指定記錄moveToFirst()移動(dòng)游標(biāo)到第一條記錄moveToLast()移動(dòng)游標(biāo)到最后一條記錄moveToNext()移動(dòng)游標(biāo)到下一條記錄moveToPrevious()移動(dòng)游標(biāo)到上一條記錄getColumnIndexOrThrow(StringcolumnName)根據(jù)列名獲得列索引getInt(intcolumnIndex)根據(jù)列索引獲得int類型值getString(intcolumnIndex)根據(jù)列索引獲得String類型值SQLite數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)如果要在/data/data/ee.example.activity_abc/databases目錄下創(chuàng)建一個(gè)名為pocketblog.db的數(shù)據(jù)庫(kù),可使用方法:openOrCreateDatabase("/data/data/ee.example.activity_abc/databases/pocketblog.db",null);創(chuàng)建數(shù)據(jù)表創(chuàng)建一個(gè)數(shù)據(jù)表UserTb,其屬性列為:uid(主鍵并且自動(dòng)增加)、uname(用戶名)、upsw(密碼),可使用代碼:Stringsql="CreatetableUserTb(uidintegerprimarykeyautoincrement,unametext,upswtext)";db.execSQL(sql);//db是指定的數(shù)據(jù)庫(kù)對(duì)象SQLite相關(guān)操作SQLite數(shù)據(jù)庫(kù)插入數(shù)據(jù)分別使用execSQL()方法和insert()方法來(lái)完成向數(shù)據(jù)表UserTb插入記錄:Stringsql="insertintoUserTb(uname,upsw)values('user01','123')";db.execSQL(sql);//執(zhí)行SQL語(yǔ)句,向db的數(shù)據(jù)表UserTb中插入一條記錄或ContentValuesmycv=newContentValues();mycv.put("uname","user01'");mycv.put("upsw","123'");db.insert("UserTb",null,mycv);//向db的數(shù)據(jù)表UserTb中插入一條記錄SQLite相關(guān)操作SQLite數(shù)據(jù)庫(kù)刪除數(shù)據(jù)和插入數(shù)據(jù)類似,使用兩種方法來(lái)實(shí)現(xiàn)刪除數(shù)據(jù)表UserTb中的記錄:Stringsql="deletefromUserTbwhereuid=2";db.execSQL(sql);//執(zhí)行SQL語(yǔ)句,在db的數(shù)據(jù)表UserTb中刪除uid為2的記錄或StringwhereClause="uid=?";String[]whereArgs={String.valueOf(2)};db.delete("UserTb",whereClause,whereArgs);//在db的數(shù)據(jù)表UserTb中刪除uid為2的記錄
這里,String.valueOf()是將其他基本數(shù)據(jù)類型轉(zhuǎn)換成String的靜態(tài)方法。例如:String.valueOf(2)是將數(shù)值2轉(zhuǎn)換成字符串值“2”。SQLite相關(guān)操作SQLite數(shù)據(jù)庫(kù)修改數(shù)據(jù)和插入或刪除數(shù)據(jù)類似,使用兩種方法來(lái)實(shí)現(xiàn)修改數(shù)據(jù)表UserTb中的記錄:Stringsql="updateUserTbsetupsw=666whereuid=1";db.execSQL(sql);//執(zhí)行SQL語(yǔ)句,在db的數(shù)據(jù)表UserTb中修改uid為1的記錄或ContentValuesnewvalue=newContentValues();newvalue.put("upsw","666");StringwhereClause="uid=?";String[]whereArgs={String.valueOf(1)};db.update("UserTb",newvalue,whereClause,whereArgs);//在db的數(shù)據(jù)表UserTb中修改uid為1的記錄SQLite相關(guān)操作SQLite數(shù)據(jù)庫(kù)查詢數(shù)據(jù)查詢數(shù)據(jù)方法將返回一個(gè)Cursor對(duì)象,這里存放的是查詢數(shù)據(jù)表的結(jié)果集。例如要查詢UserTb中uid大于5的用戶信息,可使用代碼段:Cursorqc=db.query("UserTb",null,"uid=?",newString[]{String.valueOf(5)},null,null,null);if(qc.moveToFirst()){//判斷游標(biāo)是否為空
for(inti=0;i<qc.getCount();i++){//遍歷游標(biāo)
qc.move(i);intuserid=qc.getInt(0);//獲得用戶idStringusername=qc.getString(1);//獲得用戶名
Stringuserpassword=qc.getString(2);//獲得用戶密碼
System.out.println(userid+":"+username+","+userpassword);//在屏幕上顯示用戶id,用戶名和密碼
}}SQLite相關(guān)操作SQLite應(yīng)用案例設(shè)計(jì)思路本例通過SQLiteOpenHelper來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)進(jìn)行創(chuàng)建及增、刪、改的操作,對(duì)數(shù)據(jù)結(jié)構(gòu)及其初始化用一個(gè)獨(dú)立的代碼文件實(shí)現(xiàn)。使用ListView對(duì)數(shù)據(jù)庫(kù)的信息進(jìn)行展示,并在每一條信息后增加刪除按鈕。每一個(gè)刪除按鈕對(duì)應(yīng)的一條數(shù)據(jù)記錄做刪除操作。【案例9.2】對(duì)某商家顧客信息進(jìn)行管理,要求把VIP用戶信息存儲(chǔ)到數(shù)據(jù)庫(kù)中,并且實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中信息的瀏覽和刪除。開發(fā)步驟數(shù)據(jù)庫(kù)設(shè)計(jì)。在本項(xiàng)目中只設(shè)計(jì)與日志相關(guān)的數(shù)據(jù)表。準(zhǔn)備顏色資源。編寫colors.xml文件,分別聲明black、white、grey、darkgrey、red和blue這些顏色。準(zhǔn)備圖片和背景資源。復(fù)制back.jpg作為背景圖片資源到本項(xiàng)目的res/drawable目錄中。在該目錄中,還使用XML文件定義了文本輸入框的背景樣式、文本框各種狀態(tài)的樣式。設(shè)計(jì)布局,本項(xiàng)目至少有三個(gè)Activity。activity_main.xml設(shè)計(jì)主Activity,activity_sqlite_write.xml設(shè)計(jì)寫入數(shù)據(jù)庫(kù)Activity,activity_sqlite_read.xml設(shè)計(jì)瀏覽和刪除數(shù)據(jù)庫(kù)信息的Activity。開發(fā)數(shù)據(jù)庫(kù)管理操縱代碼。需要開發(fā)與數(shù)據(jù)庫(kù)管理與操縱相關(guān)的類。開發(fā)邏輯代碼。本案例有三個(gè)Activity,必須有三個(gè)類實(shí)現(xiàn)代碼。SQLite應(yīng)用案例在該項(xiàng)目中,命名數(shù)據(jù)庫(kù)名為customerserve,命名數(shù)據(jù)表名為user_info。列名類型默認(rèn)值是否為空說(shuō)明u_idinteger0NotNull用戶ID,主鍵,自增u_namevarchar“”NotNull用戶姓名u_ageinteger0NotNull用戶年齡u_sexintegertrueNotNull用戶性別buy_creditslong0lNotNull用戶積分buy_totalsfloat0.0fNotNull用戶總消費(fèi)金額update_timevarchar“”NotNull更新時(shí)間u_phonevarchar“”
用戶電話號(hào)碼u_passwordvarcjar“”
用戶密碼SQLite應(yīng)用案例editext_selector.xml1<?xmlversion="1.0"encoding="utf-8"?>2<selectorxmlns:android="/apk/res/android">3<item4android:state_focused="true"5android:drawable="@drawable/shape_edit_focus"/>6<item7android:drawable="@drawable/shape_edit_normal"/>8</selector>1<?xmlversion="1.0"encoding="utf-8"?>2<shapexmlns:android="/apk/res/android">3<solidandroid:color="@color/white"/>4<stroke5android:width="1dp"6android:color="@color/blue"/>7<corners8android:bottomLeftRadius="5dp"9android:bottomRightRadius="5dp"10android:topLeftRadius="5dp"11android:topRightRadius="5dp"/>12<padding13android:bottom="2dp"14android:left="10dp"15android:right="10dp"16android:top="2dp"/>17</shape>shape_edit_focus.xmlSQLite應(yīng)用案例數(shù)據(jù)表結(jié)構(gòu)類1packageee.example.activity_sqlitedatabase.bean;3publicclassUserInfo{4publicintuserid;5publicStringname;6publicintage;7publicbooleansex;8publiclongcredits;9publicfloattotals;10publicStringupdate_time;11publicStringphone;12publicStringpassword;14publicUserInfo(){15userid=0;16name="";17age=0;18sex=true;19credits=0l;20totals=0.0f;21update_time="";22phone="";23password="";24}25}在項(xiàng)目包中創(chuàng)建一個(gè)bean目錄,在其下創(chuàng)建一個(gè)名為UserInfo.java的代碼文件。該代碼文件主要是定義一個(gè)數(shù)據(jù)庫(kù)表的數(shù)據(jù)結(jié)構(gòu)類,并在構(gòu)造方法中對(duì)數(shù)據(jù)進(jìn)行初始化。SQLite應(yīng)用案例數(shù)據(jù)表管理類代碼:MyDBHelper.java代碼片段14publicclassMyDBHelperextendsSQLiteOpenHelper{68@Override69publicvoidonCreate(SQLiteDatabasedb){70Log.d(TAG,"onCreate");Stringdrop_sql="DROPTABLEIFEXISTS"+TABLE_NAME+";";72Log.d(TAG,"drop_sql:"+drop_sql);73db.execSQL(drop_sql);Stringcreate_sql="CREATETABLEIFNOTEXISTS"+TABLE_NAME+"("+"u_idINTEGERPRIMARYKEYAUTOINCREMENTNOTNULL,"+"u_nameVARCHARNOTNULL,"+"u_ageINTEGERNOTNULL,"+"u_sexINTEGERNOTNULL,"+"buy_creditsLONGNOTNULL,"+"buy_totalsFLOATNOTNULL,"+"update_timeVARCHARNOTNULL,"+"u_phoneVARCHAR,"+"u_passwordVARCHAR"+");";75Log.d(TAG,"create_sql:"+create_sql);76db.execSQL(create_sql);77}100publiclonginsert(ArrayList<UserInfo>infoArray){102for(inti=0;i<infoArray.size();i++){103UserInfoinfo=infoArray.get(i);104ArrayList<UserInfo>tempArray=newArrayList<UserInfo>();106if(!=null&&.length()>0){107Stringcondition=String.format("u_name='%s'",);108tempArray=query(condition);109if(tempArray.size()>0){110update(info,condition);111result=tempArray.get(0).userid;112continue;113}114}116ContentValuescv=newContentValues();117cv.put("u_name",);118cv.put("u_age",info.age);119cv.put("u_sex",info.sex);120cv.put("buy_credits",info.credits);121cv.put("buy_totals",info.totals);122cv.put("update_time",info.update_time);123cv.put("u_phone",info.phone);124cv.put("u_password",info.password);125result=mDB.insert(TABLE_NAME,"",cv);127if(result==-1){128returnresult;129}130}131returnresult;132}SQLite應(yīng)用案例SQLiteWriteActivity.java代碼片段publicclassSQLiteWriteActivityextendsimplementsOnClickListener{28protectedvoidonCreate(BundlesavedInstanceState){29super.onCreate(savedInstanceState);30setContentView(R.layout.activity_sqlite_write);31et_name=(EditText)findViewById(R.id.et_name);32et_age=(EditText)findViewById(R.id.et_age);33et_credits=(EditText)findViewById(R.id.et_credits);34et_totals=(EditText)findViewById(R.id.et_totals);35findViewById(R.id.btn_save).setOnClickListener(this);ArrayAdapter<String>typeAdapter=newArrayAdapter<String>(this,R.layout.item_select,typeArray);38typeAdapter.setDropDownViewResource(R.layout.item_dropdown);39Spinnersp_bemale=(Spinner)findViewById(R.id.sp_bemale);40sp_bemale.setPrompt("請(qǐng)選擇性別");41sp_bemale.setAdapter(typeAdapter);42sp_bemale.setSelection(0);sp_bemale.setOnItemSelectedListener(newTypeSelectedListener());44}47classTypeSelectedListenerimplementsOnItemSelectedListener{48publicvoidonItemSelected(AdapterView<?>arg0,Viewarg1,intarg2,longarg3){49bemale=(arg2==0)?true:false;50}51publicvoidonNothingSelected(AdapterView<?>arg0){}53}69publicvoidonClick(Viewv){70if(v.getId()==R.id.btn_save){71Stringname=et_name.getText().toString();74Stringtotals=et_totals.getText().toString();75if(name==null||name.length()<=0){76showToast("請(qǐng)先填寫姓名");77return;78}87if(totals==null||totals.length()<=0){88showToast("請(qǐng)先填寫購(gòu)買總額");89return;90}91 92UserInfoinfo=newUserInfo();93=name;94info.age=Integer.parseInt(age);95info.sex=bemale;96info.credits=Long.parseLong(credits);97info.totals=Float.parseFloat(totals);info.update_time=DateUtil.getNowDateTime("yyyy-MM-ddHH:mm:ss");99mHelper.insert(info);100showToast("數(shù)據(jù)已寫入SQLite數(shù)據(jù)庫(kù)");101}102}SQLite應(yīng)用案例SQLiteReadActivity.java代碼片段69privateArrayList<HashMap<String,String>>getData(){ArrayList<HashMap<String,String>>listItem=newArrayList<HashMap<String,String>>();71Stringdesc;72ArrayList<UserInfo>uArray=readSQLite();73setTitle(String.format("數(shù)據(jù)庫(kù)查詢到%d條記錄,詳情如下:",uArray.size()));75for(inti=0;i<uArray.size();i++){76HashMap<String,String>tvitem=newHashMap<String,String>();77desc="";78UserInfoinfo=uArray.get(i);79desc=String.format("第%d個(gè)用戶:",i+1);80desc=String.format("%s\n姓名:%s",desc,);81desc=String.format("%s\n年齡:%d",desc,info.age);82if(info.sex)83desc=String.format("%s\n性別:男",desc);84else85desc=String.format("%s\n性別:女",desc);86desc=String.format("%s\n積分:%d",desc,info.credits);87desc=String.format("%s\n購(gòu)買總額:%8.2f",desc,info.totals);88desc=String.format("%s\n更新時(shí)間:%s",desc,info.update_time);89tvitem.put("ItemId",String.valueOf(info.userid));90tvitem.put("ItemText",desc);91listItem.add(tvitem);92}93returnlistItem;94}103privateclassMyAdapterextendsBaseAdapter{publicViewgetView(intposition,ViewconvertView,ViewGroupparent){144HashMap<String,String>map=datas.get(position);147holder.text.setText(map.get("ItemText"));149holder.btn.setFocusable(false);150holder.btn.setTag(String.valueOf(position));151holder.btn.setOnClickListener(152newView.OnClickListener(){153@Override154publicvoidonClick(Viewv){155intposition=Integer.parseInt((String)v.getTag());String[]whereArgs={datas.get(position).get("ItemId")};157myHelper.closeLink();158myHelper.openWriteLink();159myHelper.delete("u_id=?",whereArgs);161myHelper.closeLink();162myHelper.openReadLink();163datas=getData();//重新獲取數(shù)據(jù)164notifyDataSetChanged();//刷新ListView165}166});167returnconvertView;168}169}SQLite應(yīng)用案例運(yùn)行結(jié)果(a)初始運(yùn)行界面(b)寫入數(shù)據(jù)庫(kù)界面(c)讀取數(shù)據(jù)庫(kù)界面(d)查看數(shù)據(jù)庫(kù)文件訪問SD卡簡(jiǎn)介PART.03訪問SD卡Android在應(yīng)用編程中,是通過Environment類來(lái)訪問SD卡上的信息。Environment類位于在android.os.Environment包中,是專門提供訪問環(huán)境變量的類。方法說(shuō)明getDataDirectory()返回File,獲取Android數(shù)據(jù)目錄getDownloadCacheDirectory()返回File,獲取Android下載/緩存內(nèi)容目錄getExternalStorageDirectory()返回File,獲取外部存儲(chǔ)目錄即SD卡目錄,Android10(API29)廢棄getExternalStoragePublicDirectory(Stringtype)返回File,取一個(gè)高端的公用的SD卡指定類型目錄的路徑,Android10(API29)廢棄getExternalStorageState()返回File,獲取SD卡的當(dāng)前狀態(tài),如是否存在,是否可讀寫getRootDirectory()返回File,獲取Android的根目錄getExternalStorageDirectory().getFreeSpace()判斷SD卡剩余可用空間,Android10(API29)廢棄Environment類訪問SD卡Environment類包含了大量的系統(tǒng)狀態(tài)常量。getExternalStorageState()是獲取SD卡存儲(chǔ)狀態(tài)方法,由其返回的狀態(tài)常量。常見的狀態(tài)常量常量名常量值說(shuō)明MEDIA_BAD_REMOVALbad_removalSDCard被卸載前己被移除MEDIA_CHECKINGchecking正在磁盤檢查MEDIA_MOUNTEDmountedSDCard已經(jīng)掛載,并具有可讀/寫權(quán)限MEDIA_MOUNTED_READ_ONLYmounted_roSDCard已經(jīng)掛載,并具有只讀權(quán)限MEDIA_NOFSnofsSDCard為空白或正在使用不支持的文件系統(tǒng)MEDIA_REMOVEDremovedSDCard已經(jīng)移除MEDIA_SHAREDsharedSDCard未安裝,但通過USB共享返回MEDIA_UNKNOWNunknown未知MEDIA_UNMOUNTABLEunmountableSDCard無(wú)法掛載。即SDCard存在但不可以被安裝MEDIA_UNMOUNTEDunmountedSDCard已卸掉,即SDCard存在但是沒有被安裝Environment類訪問SD卡getExternalStoragePublicDirectory(Stringtype)是獲取SD卡指定類型目錄的路徑方法。常見的目錄路徑常量。常量名常量值說(shuō)明MEDIA_BAD_REMOVALbad_removalSDCard被卸載前己被移除DIRECTORY_DCIMDCIM相機(jī)拍攝照片存放的標(biāo)準(zhǔn)目錄DIRECTORY_DOCUMENTSDocument文檔存放的標(biāo)準(zhǔn)目錄DIRECTORY_DOWNLOADSDownload下載文件存放的標(biāo)準(zhǔn)目錄DIRECTORY_MOVIESMoives視頻存放的標(biāo)準(zhǔn)目錄DIRECTORY_MUSICMusic音樂存放的標(biāo)準(zhǔn)目錄DIRECTORY_PICTURESPicture圖片存放的標(biāo)準(zhǔn)目錄Environment類訪問SD卡訪問SD卡權(quán)限聲明為了正常訪問SD卡,需要在AndroidManifest.xml文件中聲明相關(guān)的訪問權(quán)限。一般在AndroidManifest.xml文件的<application>元素前添加權(quán)限
<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"package="com.example.ee.helloandroid"><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><application……></application></manifest>訪問SD卡權(quán)限設(shè)置訪問SD卡為APP運(yùn)行時(shí)授權(quán)Google將權(quán)限分為兩類,一類是普通權(quán)限(NormalPermissions),這類權(quán)限不涉及用戶隱私,是不需要用戶進(jìn)行授權(quán)的;另一類是危險(xiǎn)權(quán)限(DangerousPermission),這類權(quán)限會(huì)涉及到用戶隱私,需要用戶進(jìn)行授權(quán)。從Android6.0(SDK23)以后,系統(tǒng)在運(yùn)行時(shí)權(quán)限上增加了對(duì)用戶隱私權(quán)的保護(hù)功能。除了需要在AndroidManifest.xml中添加相應(yīng)的訪問權(quán)限聲明外,還需要在應(yīng)用項(xiàng)目APP的運(yùn)行時(shí),為每個(gè)危險(xiǎn)權(quán)限類向系統(tǒng)進(jìn)行請(qǐng)求授權(quán)。從外部存儲(chǔ)設(shè)備中讀寫文件屬于危險(xiǎn)權(quán)限,因此需要在java代碼中,使用系統(tǒng)提供的API檢查并請(qǐng)求權(quán)限動(dòng)態(tài)授權(quán)。訪問SD卡權(quán)限設(shè)置訪問SD卡權(quán)限檢查和請(qǐng)求授權(quán)方法定義在ActivityCompat類中。1)檢查權(quán)限方法ActivityCompat.checkSelfPermission(android.content.Context,java.lang.String)檢查是否擁有指定的權(quán)限,返回類型為int類型,一般用符號(hào)常量表示。返回值為PackageManager.PERMISSION_GRANTED,表示已擁有權(quán)限;返回值為PERMISSION_DENIED,表示沒有該權(quán)限,需要向用戶請(qǐng)求授權(quán)。2)展示需要授權(quán)的理由方法shouldShowRequestPermissionRationale(Activityactivity,Stringpermission)在用戶第一次點(diǎn)擊一個(gè)需要權(quán)限的地方,該方法返回false,如果當(dāng)用戶選擇了拒絕該權(quán)限,下次點(diǎn)擊此權(quán)限處,該方法會(huì)返回true。檢查與請(qǐng)求授權(quán)訪問SD卡3)請(qǐng)求權(quán)限方法requestPermissions(Activityactivity,String[]permissions,intrequestCode)為該APP請(qǐng)求指定的權(quán)限。其中:第二個(gè)參數(shù)permissions是一個(gè)String數(shù)組,數(shù)組元素是APP所需要申請(qǐng)的所有權(quán)限。這些權(quán)限常量可以在Manifest類中找到。第三個(gè)參數(shù)requestCode標(biāo)志該次授權(quán)的唯一請(qǐng)求碼,當(dāng)用戶進(jìn)行授權(quán)操作后在回調(diào)方法中可以根據(jù)這個(gè)標(biāo)識(shí)符區(qū)分不同的授權(quán)操作。4)請(qǐng)求權(quán)限后的回調(diào)方法onRequestPermissionsResult(intrequestCode,String[]permissions,int[]grantResults)該方法是OnRequestPermissionsResultCallback類中的方法,當(dāng)執(zhí)行了requestPermissions()方法后,系統(tǒng)會(huì)自動(dòng)回調(diào)onRequestPermissionsResult()方法。其中第三個(gè)參數(shù)grantResults是int類型的數(shù)組,每個(gè)元素的值分別對(duì)應(yīng)permissions的每個(gè)請(qǐng)求,取值由PackageManager的常量表示,為PackageManager.PERMISSION_GRANTED或PackageManager.PERMISSION_DENIED。檢查與請(qǐng)求授權(quán)訪問SD卡為應(yīng)用項(xiàng)目APP請(qǐng)求外存儲(chǔ)器讀寫授權(quán)代碼片段1privatestaticfinalintREQUEST_EXTSTO=1;privatestaticString[]PERMISSIONS_STORAGE={Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};3intpermission_read=ActivityCompat.checkSelfPermission(activity,Manifest.permission.READ_EXTERNAL_STORAGE);4intpermission_write=ActivityCompat.checkSelfPermission(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE);5//檢查是否有讀外存權(quán)限6if(permission_write!=PackageManager.PERMISSION_GRANTED||permission_read!=PackageManager.PERMISSION_GRANTED){7if(ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.READ_EXTERNAL_STORAGE)||ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE)){8AlertDialogdialog=newAlertDialog.Builder(this).setTitle("該權(quán)限保證對(duì)SD卡上文件進(jìn)行讀寫操作").setPositiveButton("需要此權(quán)限!",newDialogInterface.OnClickListener(){9@Override10publicvoidonClick(DialogInterfacedialog,intwhich){ActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS_STORAGE,REQUEST_EXTSTO);11}}).setNegativeButton("不授權(quán)",newDialogInterface.OnClickListener(){13@Override14publicvoidonClick(DialogInterfacedialog,intwhich){Toast.makeText(MainActivity.this,"重新授權(quán)",Toast.LENGTH_SHORT).show();16}17}).show();18}else{19//沒有權(quán)限,需要?jiǎng)討B(tài)申請(qǐng)ActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE,REQUEST_EXTSTO);21}在完成權(quán)限請(qǐng)求方法之后,即執(zhí)行了ActivityCompat.requestPermissions()方法后,系統(tǒng)會(huì)自動(dòng)回調(diào)onRequestPermissionsResult()方法。訪問SD卡請(qǐng)求授權(quán)時(shí)會(huì)彈出Android系統(tǒng)內(nèi)置的對(duì)話框,例如應(yīng)用項(xiàng)目Activity_SurfaceView需要讀取SD卡中的文件,在請(qǐng)求授權(quán)后會(huì)彈出訪問授權(quán)對(duì)話框,如右圖所示。用戶不能自定義該對(duì)話框。該授權(quán)對(duì)話框一經(jīng)用戶同意授權(quán),以后運(yùn)行該APP都不會(huì)再出現(xiàn)。建議用戶選擇“ALLOW”,同意該授權(quán)。訪問SD卡檢測(cè)SD卡是否可用編寫一個(gè)sdcardisavailable()方法來(lái)檢測(cè)SD卡是否可用,該方法的代碼如下
publicstaticbooleansdcardisavailable(){stringstatus=environment.getexternalstoragestate();if(!status.equals(environment.media_mounted)){returnfalse;}returntrue;}關(guān)于SD卡的相關(guān)編程片段訪問SD卡獲取SD卡的實(shí)際空間大小編寫一個(gè)getrealsizeonsdcard()方法來(lái)獲取SD卡的實(shí)際空間大小,該方法的代碼如下
publicstaticlonggetrealsizeonsdcard(){filepath=newfile(environment.getexternalstoragedirectory().getabsolutepath());statfsstat=newstat
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年網(wǎng)絡(luò)規(guī)劃考試指南試題及答案
- 通迅保密協(xié)議書范本
- 期刊版權(quán)授權(quán)協(xié)議書
- 民間債權(quán)轉(zhuǎn)讓協(xié)議書
- 糧庫(kù)租賃協(xié)議書范本
- 暖氣安裝清理協(xié)議書
- 急救聯(lián)盟協(xié)議書模板
- 員工工傷自負(fù)協(xié)議書
- 交易賬戶托管協(xié)議書
- 死亡撫恤協(xié)議書乙方
- 2025年中國(guó)短圓柱滾子軸承市場(chǎng)調(diào)查研究報(bào)告
- 教師的情緒管理課件
- 湖北省十一校2024-2025學(xué)年高三第二次聯(lián)考數(shù)學(xué)試卷(解析版)
- 英語(yǔ)-華大新高考聯(lián)盟2025屆高三3月教學(xué)質(zhì)量測(cè)評(píng)試題+答案
- 《手工制作》課件-幼兒園掛飾
- 【初中地理】西亞+課件-2024-2025學(xué)年人教版地理七年級(jí)下冊(cè)
- 鼓勵(lì)員工發(fā)現(xiàn)安全隱患的獎(jiǎng)勵(lì)制度
- 蘇教版一年級(jí)下冊(cè)數(shù)學(xué)全冊(cè)教學(xué)設(shè)計(jì)(配2025年春新版教材)
- 【特易資訊】2025中國(guó)二手車行業(yè)出口分析及各國(guó)進(jìn)口政策影響白皮書
- (一診)2025年蘭州市高三診斷考試生物試卷(含官方答案)
- 光伏發(fā)電項(xiàng)目施工的應(yīng)急預(yù)案與措施
評(píng)論
0/150
提交評(píng)論