android資料庫鎖-九游会j9娱乐平台
1. android 寮鍙戜腑錛屾湁鍝浜涘潙闇瑕佹敞鎰
1. 涓篈ctivity澹版槑緋葷粺閰嶇疆鍙樻洿浜嬩歡
緋葷粺閰嶇疆鍙樻洿浜嬩歡鏄鎸囪漿灞忥紝鍖哄煙璇璦鍙戠敓鍙樺寲錛屽睆騫曞昂瀵稿彂鐢熷彉鍖栫瓑絳夛紝濡傛灉activity娌℃湁澹版槑澶勭悊榪欎簺浜嬩歡錛屽彂鐢熶簨浠舵椂錛岀郴緇熶細鎶夾ctivity鏉鎺夌劧鍚庨噸鍚錛屽苟灝濊瘯鎮㈠嶇姸鎬侊紝activity鏈夋満浼氶氳繃onsaveinstancestate()淇濆瓨涓浜涘熀鏈鏁版嵁鍒癇undle涓錛岀劧鍚庢bundle浼氬湪activity鐨刼ncreate()涓浼犻掕繃鍘匯傝櫧鐒惰繖璨屼技姝e父錛屼絾鏄榪欎細寮曞彂闂棰橈紝鍥犱負寰堝氬叾浠栫殑涓滆タ姣斿侱ialog絳夋槸瑕佷緷璧栦簬鍏蜂綋activity瀹炰緥鐨勩傛墍浠ヨ繖縐嶇郴緇熼粯璁よ屼負閫氬父閮戒笉鏄鎴戜滑鎯寵佺殑銆
涓轟簡閬垮厤榪欎簺緋葷粺榛樿よ屼負錛屽氨闇瑕佷負activity澹版槑榪欎簺閰嶇疆錛屽備笅浜屼釜鏄姣忎釜activity蹇呴』澹版槑鐨勶細
鍑犱箮鎵鏈夌殑activity閮借佸0鏄庡備笂錛屼負浠涔圓ndroid涓嶆妸瀹冧滑鍙樻垚default鐨勫憿?
2. 灝介噺浣跨敤android鐨凙pi
榪欏ソ鍍忔槸搴熻瘽錛屽湪android涓婇潰寮鍙戜笉鐢ˋndroid api鐢ㄤ粈涔堬紵鍥犱負android鍑犱箮鏀鎸丣ava se鎵鏈夌殑api錛屾墍浠ユ湁寰堝氬湴鏂笰ndroid api涓嶫ava se鐨凙pi浼氭湁閲嶅嶇殑鍦版柟錛屾瘮濡傝村逛簬鏂囦歡鐨勬搷浣滄渶濂戒嬌鐢ˋndroid閲岄潰context灝佽呯殑api錛岃屼笉瑕佺洿鎺ヤ嬌鐢‵ile瀵硅薄錛
context.openfileoutput(string); // no file file = new file(string)
鍘熷洜灝辨槸api閲岄潰浼氳冭檻鍒癆ndroid騫沖彴鏈韜鐨勭壒鎬э紱鍐嶅傦紝灝戠敤thread錛岃屽氫嬌鐢ˋsynctask絳夈
3. 瑕佽冭檻鍒癆ctivity鍜岃繘紼嬭鏉鎺夌殑鎯呭喌
濡備簡閫氬父鎯呭喌閫鍑篈ctivity澶栵紝榪樻湁activity鍥犲叾浠栧師鍥犺鏉鐨勬儏鍐碉紝姣斿傜郴緇熷唴瀛樿繃浣庯紝緋葷粺閰嶇疆鍙樻洿錛屾湁寮傚父絳夌瓑錛岃佽冭檻鍜屾祴璇曡繖縐嶆儏鍐碉紝鐗瑰埆鏄疉ctivity澶勭悊閲嶈佺殑鏁版嵁鏃訛紝鍋氬ソ鐨勬暟鎹鐨勪繚瀛樸
4. 灝忓績澶氳璦
鏈変簺璇璦鐪熺殑寰堝暟鍡︼紝涓鏂囨垨鑻辨枃寰堢畝鐭灝辮兘琛ㄨ揪鐨勪簨鎯呭埌浜嗗叾浠栬璦灝卞彉鐨勬婚暱姝婚暱鐨勶紝鎵浠ュ傛灉鏄痺rap_content灝卞彲鑳芥妸鍏朵粬鎺у埗鎸ゅ嚭鍙瑙嗚寖鍥達紱 濡傛灉鏄鎸囧畾闀垮害灝卞彲鑳芥樉紺轟笉鍏ㄣ備篃瑕佹敞鎰忕壒孌婅璦姣斿傞偅浜涗粠鍙沖悜宸﹁葷殑璇璦銆
5. 涓嶈佺敤鍥涘ぇ緇勪歡鍘誨疄鐜版帴鍙
涓鏄緇勪歡鐨勫硅薄閮芥瘮杈冨ぇ錛屽疄鐜版帴鍙f瘮杈冩氮璐癸紝鑰屼笖璁╀唬鐮佹洿涓嶆槗璇誨拰鐞嗚в錛 鍙﹀栨洿閲嶈佺殑鏄瀵艱嚧澶氭柟寮曠敤錛屽彲鑳戒細寮曞彂鍐呭瓨娉勯湶銆
6. 鐢╣etapplication()鏉ュ彇context褰撳弬鏁
瀵逛簬闇瑕佷嬌鐢–ontext瀵硅薄浣滀負鍙傛暟鐨勫嚱鏁幫紝瑕佷嬌鐢╣etapplication()鑾峰彇context瀵硅薄褰撳弬鏁幫紝鑰屼笉瑕佷嬌鐢╰his錛岄櫎闈炰綘闇瑕佺壒瀹氱殑緇勪歡瀹炰緥錛乬etapplication()榪斿洖鐨凜ontext鏄灞炰簬application鐨勶紝瀹冧細鍦ㄦ暣涓搴旂敤鐨勭敓鍛藉懆鏈熷唴瀛樺湪錛岃繙澶т簬鏌愪釜緇勪歡鐨勭敓鍛藉懆鏈燂紝鎵浠ュ嵆浣挎煇涓寮曠敤闀挎湡鎸佹湁context瀵硅薄涔熶笉浼氬紩鍙戝唴瀛樻硠闇層
7. 涓葷嚎紼嬪彧鍋歎i鎺у埗鍜孎rameworks鍥炶皟鐩稿叧鐨勪簨銆傞檮灞炵嚎紼嬪彧鍋氳垂鏃剁殑鍚庡彴鎿嶄綔銆備氦浜掑彧閫氳繃handler銆傝繖鏍峰氨鍙浠ラ伩鍏嶅ぇ閲忕殑綰跨▼闂棰樸
8. frameworks鐨勫洖璋冧笉瑕佸仛澶澶氫簨鎯呬粎鍋氬繀瑕佺殑鍒濆嬪寲錛屽叾浠栦笉鏄寰堥噸瑕佺殑浜嬫儏鍙浠ユ斁鍒板叾浠栫嚎紼嬩腑鍘誨仛錛屾垨鑰呯敤handler schele鍒扮◢鍚庡啀鍋氥
9. 瑕佽冭檻澶氬垎杈ㄧ巼
鑷沖皯涓篽dpi, mdpi, ldpi鍑嗗囧浘鐗囧拰甯冨矓銆傚厓緔犵殑鍗曚綅涔熷敖鍙鑳界殑浣跨敤dip鑰屼笉瑕佺敤px銆
10. 鍒╃敤android鎵嬫満鐨勭‖閿
鍑犱箮鎵鏈夌殑android鎵嬫満閮芥湁back鍜孧enu錛屽畠浠鐨勪綔鐢ㄦ槸榪斿洖鍜屽脊鍑鴻彍鍗曪紝鎵浠ュ氨涓嶈佸啀鍦║i涓璁捐¤繑鍥炴寜鎵鍜岃彍鍗曟寜鎵銆傚緢澶氫紭縐鐨勫簲鐢ㄥ傞殢鎵嬭板拰寰淇¢兘鏈夎繑鍥為敭錛屼粬浠涔嬫墍浠ユ湁鏄鍥犱負浠栦滑閮芥槸浠巌os涓婄щ妞嶈繃鏉ョ殑錛屼負浜嗕繚瀛樹綋楠岀殑涓鑷達紝鎵浠ヤ篃鏈変簡榪斿洖鍜岃彍鍗曘備絾榪欎笉澶烝ndroid鍖栵紝涓涓綰姝g殑android鏄娌℃湁蹇呴』閲嶅嶇‖閿鐨勫姛鑳界殑銆
2. 京東怎麼設置密碼鎖不讓別人看
京東設置密碼鎖不讓別人看方法:
1、打開京東app,點擊「我的」。2、找到輪齒狀的按鈕,點擊進去。3、進入賬戶設置界面後,找到「賬戶與安全」並點擊進去。4、可以選擇自己方便的認證方式,本文使用手機簡訊驗證。5、點擊「獲取驗證碼」,獲取驗證碼後填寫進框內。6、填寫安全的密碼便可完成密碼設置。
手機找到京東app,打開:點擊最下面一欄菜單中的【我的】:點擊個人頁面中的頭像:在賬戶設置頁面中點擊賬戶安全。
3. android 數據存儲的幾種方式
總體的來講,數據存儲方式有三種:一個是文件,一個是資料庫,另一個則是網路。其中文件和資料庫可能用的稍多一些,文件用起來較為方便,程序可以自己定義格式;資料庫用起稍煩鎖一些,但它有它的優點,比如在海量數據時性能優越,有查詢功能,可以加密,可以加鎖,可以跨應用,跨平台等等;網路,則用於比較重要的事情,比如科研,勘探,航空等實時採集到的數據需要馬上通過網路傳輸到數據處理中心進行存儲並進行處理。 對於android平台來講,它的存儲方式也不外乎這幾種,按方式總體來分,也是文件,資料庫和網路。但從開發者的角度來講它可以分為以下五種方式: 1.sharedpreferences共享偏好 2.internal storage內部存儲空間 3.external storage外部存儲空間 4.sqlite database資料庫 5.internet網路 這幾種方式各自有各自的優點和缺點,要根據不同的實際情況來選擇,而無法給出統一的標准。下面就各種方式談談它們的優缺點,以及最合適的使用情況: 1.shared preferences共享偏好 sharedpreferences是用來存儲一些key/value類似的成對的基本數據類型,注意,它只能存儲基本數據類型,也即int, long, boolean, string, float。事實上它完全相當於一個hashmap,唯一不同的就是hashmap中的value可以是任何對象,而sharedpreferences中的值只能存儲基本數據類型(primitive types)。 對於它的使用方法,可以參考android developer guide,這里不重復。 如此來看,最適合sharedpreferences的地方就是保存配置信息,因為很多配置信息都是key/value。事實上,在android當中sharedpreferences使用最多的地方也是用來保存配置(settings)信息,系統中的settings中這樣,各個應用中的settings也是這樣。並且,android中為了方便的使用sharedpreferences保存配置信息,它來專門有preferenceactivity用來封裝。也就是說如果你想在應用程序中創建配置(settings),你可以直接使用preferenceactivity和一些相關的專門為preference封裝的組件,而不用再直接去創建,讀取和保存sharedpreference,framework中的這些組件會為你做這些事。 再談談一些使用sharedpreference時的技巧,它只能保存基本數據類型,但假如我想保存一個數組,怎麼辦?可以把數據進行處理,把它轉化成一個string,取出的時候再還原就好了;再如,如想保存一個對象,怎麼辦,同樣,可以把對象序列化成為字元序列,或轉成string(object.tostring()),或是把它的hashcode(object.hashcode())當成value保存進去。 總之,sharedpreferences使用起來十分的方便,可以靈活應用,因為它簡單方便,所以能用它就盡量不要用文件或是資料庫。 1.internal storage內部存儲空間 所謂的內部存儲與外部存儲,是指是否是手機內置。手機內置的存儲空間,稱為內部存儲,它是手機一旦出廠就無法改變,它也是手機的硬體指標之一,通常來講手機內置存儲空間越大意味著手機價格會越貴(很多地方把它稱為手機內存,但我們做軟體的知道,這並不準確,內存是指手機運行時存儲程序,數據和指令的地方;這里應該是手機內部存儲的簡稱為內存,而並非嚴格意義上的內存)。 內部存儲空間十分有限,因而顯得可貴,所以我們要盡可能避免使用;另外,它也是系統本身和系統應用程序主要的數據存儲所在地,一旦內部存儲空間耗盡,手機也就無法使用了。所以對於內部存儲空間,我們要盡量避免使用。上面所談到的shared preferences和下面要談到的sqlite資料庫也都是存儲在內部存儲空間上的。 android本身來講是一個linux操作系統,所以它的內部存儲空間,對於應用程序和用戶來講就是「/data/data"目錄。它與其他的(外部的存儲)相比有著比較穩定,存儲方便,操作簡單,更加安全(因為可以控制訪問許可權)等優點。而它唯一的缺點就是它比較有限,比較可貴。 雖然,可以非常容易的知道程序本身的數據所在路徑,所有的應用程序的數據路徑都是「/data/data/app-package-name/」,所有的程序用到的數據,比如libs庫,sharedpreferences都是存放在這個路徑下面。但我們在使用的時候最好不要,或是千萬不要直接引用這個路徑。 使用內部存儲主要有二個方式,一個是文件操作,一個是文件夾操作。無論哪種方式,context中都提供了相應的函數來支持,使用context不但操作簡單方便,最重要的是context會幫助我們管理這些文件,也可以方便幫助我們控制文件的訪問許可權。先來系統的說下context中關於文件和文件夾操作的函數有哪些。 a. 創建一個文件,並打開成一個文件輸出流,需要提供一個string,作為文件名 1.fileoutputstream output = context.openoutputfile(filename, context.mode_private); 2.output.write(data);// use output to write whatever you like 3.output.close(); 1.fileoutputstream output = context.openoutputfile(filename, context.mode_private); output.write(data);// use output to write whatever you like output.close(); b. 同樣,想打開一個文件作為輸入的話,也是只需要提供文件名 1.fileinputstream input = context.openinputfile(filename); 2.input.read(); 3.input.close(); 1.fileinputstream input = context.openinputfile(filename); input.read(); input.close(); c. 列出所有的已創建的文件 1.string[] files = context.filelist(); 2.for (string file : files) { 3. log.e(tag, "file is " file); 4.} 1.string[] files = context.filelist(); for (string file : files) { log.e(tag, "file is " file); } d. 刪除文件,能創建就要能夠刪除,當然也會提供了刪除文件的介面,它也非常簡單,只需要提供文件名 1.if (context.deletefile(filename)) { 2. log.e(tag, "delete file " filename " sucessfully「); 3.} else { 4. log.e(tag, "failed to delete file " filename); 5.} 1.if (context.deletefile(filename)) { log.e(tag, "delete file " filename " sucessfully「); } else { log.e(tag, "failed to delete file " filename); } e. 獲取文件已創建文件的路徑,它返回一個文件對象用於操作路徑 1.file filedir = context.getfiledir(); 2.log.e(tag, "filedir " filedir.getabsolutepath(); 1.file filedir = context.getfiledir(); log.e(tag, "filedir " filedir.getabsolutepath(); f. 創建一個目錄,需要傳入目錄名稱,它返回 一個文件對象用到操作路徑 1.file workdir = context.getdir(dirname, context.mode_private); 2.log.e(tag, "workdir " workdir.getabsolutepath(); 1.file workdir = context.getdir(dirname, context.mode_private); log.e(tag, "workdir " workdir.getabsolutepath(); g. 以file對象方式查看所創建文件,需要傳入文件名,會返迴文件對象 1.file store = context.openfilestreampath(filename); 2.log.e(tag, "store " store.length()); 1.file store = context.openfilestreampath(filename); log.e(tag, "store " store.length()); h. 獲取cache路徑,無需要傳入參數,返迴文件對象 1.file cachedir = context.getcachedir(); 2.log.e(tag, "cachedir " cachedir.getabsolutepath()); 1.file cachedir = context.getcachedir(); log.e(tag, "cachedir " cachedir.getabsolutepath()); 總結一下文件相關操作,可以得出以下三個特點: 1. 文件操作只需要向函數提供文件名,所以程序自己只需要維護文件名即可; 2. 不用自己去創建文件對象和輸入、輸出流,提供文件名就可以返回file對象或輸入輸出流 3. 對於路徑操作返回的都是文件對象。 如前所述,內部存儲空間有限,可貴,安全,穩定,所以應該用來保存比較重要的數據,比如用戶信息資料,口令秘碼等不需要與其他應用程序共享的數據。也可以用來創建臨時文件,但一定要注意及時刪除。另外,對於內部存儲還有一個非常重要的特點,那就是在應用程序被卸載時,應用程序在內部存儲空間的文件數據將全部被刪除。系統這樣做的原因很簡單,就是因為內部存儲很有限,它必須保證它的可用性,因為一旦添滿,系統將無法再正常工作。 1.external storage外部存儲空間 再來談談手機外部存儲空間,與內部存儲空間相對,外部存儲空間是指手機出廠的時候不存在,用戶在使用時候可以自由添加的外部存儲介質比如ts卡,sd卡等快閃記憶體儲介質。這些快閃記憶體介質由最初的空間小價格貴,到現在的大容量價格便宜,所以幾乎每個支持外部存儲的手機上面都有大容量(大於等於2g)的快閃記憶體卡。 android也是不例外,它完全支持外部存儲介質。其實更確切的說,它是要依賴於外部存儲卡的,因為對於android系統,如果沒有外部存儲卡,很多的系統應用無法使用,比如多媒體相關的應用程序無法使用。雖然android很依賴,但是外部存儲卡也有它自身的特點,它最大的優點就是存儲空間大,基本上你可無限制的使用,也不怎麼擔心去清除數據。就目前來看,很多程序都在使用外部存儲卡,但很少有程序去主動清理數據,所以無論你的sd卡有多大,它的可用空間卻越來越少。與內部存儲不同的是,當程序卸載時,它在外部存儲所創建的文件數據是不會被清除的。所以清理外部存儲空間的責任丟給了用戶自己,每隔一段時間就去查看下sd卡,發現無用數據立馬刪除。外部存儲的缺點就是不是很穩定,對於android手機來講可以說,很不穩定,本身快閃記憶體介質就容易出問題,sd卡處於不能正常使用的狀態十分多。 先來說說外部存儲相關的使用方法和api: a. check media availability檢查介質的可用性 如前所述,外部存儲介質的穩定性十分的差,所以在使用之前一定要先檢查它的可用性,如果可用再去用 view plain to clipboardprint? 1.final string state = environment.getexternalstoragestate(); 2.if (state.equals(environment.media_mounted) || state.equals(environment.media_read_only)) {// sd card is ready to us } view plain to clipboardprint? 1.final string state = environment.getexternalstoragestate(); if (state.equals(environment.media_mounted) || state.equals(environment.media_read_only)) {// sd card is ready to us } final string state = environment.getexternalstoragestate(); if (state.equals(environment.media_mounted) || state.equals(environment.media_read_only)) {// sd card is ready to us } b. get the directory獲取外部存儲卡的路徑 事實上,外部存儲卡的路徑是「/mnt/sdcard",所以你直接這樣寫去訪問也能訪問的到。鑒於可讀性和可移植性的考慮,建議這樣寫: view plain to clipboardprint? 1.file sdcarddir = environment.getexternalstoragedirectory(); view plain to clipboardprint? 1.file sdcarddir = environment.getexternalstoragedirectory(); file sdcarddir = environment.getexternalstoragedirectory(); c. for api 8 or greater, there are some other useful apis helping to manager files and directories. 如果你使用api 8(android 2.2)或者更高,那麼sdk中又多了幾個操作外部存儲文件和路徑的介面,文檔中也建議開始者更加規范的使用sd卡。比如,創建相應的目錄去存儲相應的數據,music,picture,video等。應用程序目錄也變成了"/android/data/package-name/data"。具體的使用可以參考文檔,這里不重復。當然,就像編程規范一樣,這里只是規范,你完全可以不遵守它,但出於可讀性和可移植性,還是建議按照文檔建議的去做。 下面總結一下使用時應該注意的一些和外部存儲的特點: a. 外部存儲卡不是隨時想用就能夠用的,所以一定要記得在使用之前檢查它的可用性 b. 存儲在外部存儲卡上的數據是所有應用程序都可見,用戶也可見(使用filemanager),所以安全性不是很好,雖然文檔聲稱可以在外部存儲卡上寫程序私有數據,但貌似沒用,用filemanager仍然可以刪除或編輯文件(market上面的filemanager功能都十分的強大,能讓用戶看到sd卡中的所有文件,和操作能看到的文件)。 c. android手機支持把外部存儲卡mount至pc做為u盤,當連接數據線時,這時sd卡變成了u盤連接到了另外的操作系統中。什麼意思,就是在android當中雖然有的文件屬性(隱藏,私有等),到了pc上就不一定管用了,用戶在pc上可以隨意操作文件(這就是第二點中所提及的)。 d. 如果使用外部存儲卡保存數據,一定要額外做好異常處理:外部存儲卡不可用時把數據存入哪裡;可用的時候再怎麼同步數據(這是比較頭疼的地方,可行的做法就是當sd卡不可用時不準用戶寫數據,但這用戶體驗又不是很好,但如你所知,很多應用都這么干);你的數據被破壞了。當然常見的異常也要考慮,比如空間滿了,無法寫入,磁碟壞道等。 1.sqlite database資料庫 android對資料庫的支持很好,它本身集成了sqlite資料庫,每個應用都可以方便的使用它,或者更確切的說,android完全依賴於sqlite資料庫,它所有的系統數據和用到的結構化數據都存儲在資料庫中。 它具有以下優點: a. 效率出眾,這是無可否認的 b. 十分適合存儲結構化數據 c. 方便在不同的activity,甚至不同的應用之間傳遞數據 先前有一篇文章講到了不同activity和不同應用之間傳遞數據的麻煩,特別是對於大型數據結構,因為activity雖是java對象,但去無法像使用其他類對象那樣去創建一個實例然後使用它,更無法給activity加上setters和getters(雖然這樣做了沒有編譯錯誤)。比較好的解決方案就是把結構化數據寫入資料庫,然後在不同的activity之間傳遞它們的uri。 d. 由專門的contentprovider來幫忙管理和維護資料庫 e. 可以方便的設置訪問許可權,私有還是都可見 f. 操作方便,使用標準的crude語句,contentresolver.query(), update(), delete() insert(),詳見contentresolver g. 良好的可移植性和通用性,用標準的sql語句就能實現crude 對於它的使用方法可以去參考文檔,這里也說不清楚。 1.internet網路 網路是比較不靠譜的一個,因為移動終端的網路穩定性,以及所產生的流量讓人傷不起,用戶更傷不起。但若是對於非常重要的實時數據,或是需要發送給遠端伺服器處理的,也可以考慮使用網路實時發送。這已經有先例了,apple和google就是這樣,iphone設備和android設備都會在用戶不知情的情況 下收集用戶的信息,然後又在用戶不知情的情況 下發送到apple和google的伺服器上,也就是所謂的「跟蹤門」。除此之外,智能手機(特別是android和火熱的iphone)上面的應用程序都會偷偷的在後台運行,收集用戶數據,然後再偷偷的發伺服器,直接傷害是用戶流量,請看先前的文章。 對比這幾種方式,可以總結下: 1. 簡單數據和配置信息,sharedpreference是首選; 2. 如果sharedpreferences不夠用,那麼就創建一個資料庫 3. 結構化數據,一定要創建資料庫,雖然這稍顯煩鎖,但是好處無窮 4. 文件就是用來存儲文件(也即非配置信息或結構化數據),如文本文件,二進制文件,pc文件,多媒體文件,下載的文件等等。 5. 盡量不要創建文件 6. 如果創建文件,如果是私密文件或是重要文件,就存儲在內部存儲,否則放到外部存儲 7. 不要收集用戶數據,更不要發到網路上,雖然你們也有很多無奈。用戶也無奈,也無辜,但更無助 平台為開發者准備了這么多的方式固然是一件好事,但我們要認清每一種的優點和缺點,根據實際情況選擇最合適的。還有一個原則就是最簡單原則,也就是說能用簡單的方式處理,就不要用復雜的方式。比如存儲幾個數據或簡單對象,用sharedpreference也能做到,何必還去寫個contentprovider呢?
4. android開發 sqlite作用
sqlite簡介
google為andriod的較大的數據處理提供了sqlite,他在數據存儲、管理、維護等各方面都相當出色,功能也非常的強大。sqlite具備下列特點:
1.輕量級
使用 sqlite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。
2.獨立性
sqlite 資料庫的核心引擎不需要依賴第三方軟體,也不需要所謂的「安裝」。
3.隔離性
sqlite 資料庫中所有的信息(比如表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。
4.跨平台
sqlite 目前支持大部分操作系統,不至電腦操作系統更在眾多的手機系統也是能夠運行,比如:android。
5.多語言介面
sqlite 資料庫支持多語言編程介面。
6.安全性
sqlite 資料庫通過資料庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一資料庫讀取數據,但只能有一個可以寫入數據。
android中的sqlite使用
首先創建資料庫類
public class databasehelper extends sqliteopenhelper {
private static final string db_name = "mydata.db"; //資料庫名稱
private static final int version = 1; //資料庫版本
public databasehelper(context context) {
super(context, db_name, null, version);
// todo auto-generated constructor stub
}
@override
public void oncreate(sqlitedatabase db) {
string sql = "create table user(username varchar(20) not null , password varchar(60) not null );";
db.execsql(sql);
}
@override
public void onupgrade(sqlitedatabase db, int oldversion, int newversion) {
// todo auto-generated method stub
}
}
sqliteopenhelper類介紹
sqliteopenhelper是sqlitedatabase的一個幫助類,用來管理資料庫的創建和版本的更新。一般是建立一個類繼承它,並實現它的oncreate和onupgrade方法。
方法名
方法描述
sqliteopenhelper(context context,string name,sqlitedatabase.cursorfactory factory,int version) 構造方法,一般是傳遞一個要創建的資料庫名稱那麼參數
oncreate(sqlitedatabase db) 創建資料庫時調用
onupgrade(sqlitedatabase db,int oldversion , int newversion) 版本更新時調用
getreadabledatabase() 創建或打開一個只讀資料庫
getwritabledatabase() 創建或打開一個讀寫資料庫
下面來介紹調用的方法
創建資料庫
這里特別的地方是通過調用了sqliteopenhelper類的getreadabledatabase()方法來實現創建一個資料庫的
1
2
3
databasehelper database = new databasehelper(this);//這段代碼放到activity類中才用this
sqlitedatabase db = null;
db = database.getreadalbedatabase();
sqlitedatabase類為我們提供了很多種方法,而較常用的方法如下
(返回值)方法名
方法描述
(int) delete(string table,string whereclause,string[] whereargs) 刪除數據行的便捷方法
(long) insert(string table,string nullcolumnhack,contentvalues values) 添加數據行的便捷方法
(int) update(string table, contentvalues values, string whereclause, string[] whereargs) 更新數據行的便捷方法
(void) execsql(string sql) 執行一個sql語句,可以是一個select或其他的sql語句
(void) close() 關閉資料庫
(cursor) query(string table, string[] columns, string selection, string[] selectionargs, string groupby, string having, string orderby, string limit) 查詢指定的數據表返回一個帶游標的數據集
(cursor) rawquery(string sql, string[] selectionargs) 運行一個預置的sql語句,返回帶游標的數據集(與上面的語句最大的區別就是防止sql注入)
數據的添刪改查分別可以通過2種途徑來實現
數據的添加
1.使用insert方法
1
2
3
contentvalues cv = new contentvalues();//實例化一個contentvalues用來裝載待插入的數據cv.put("username","jack johnson");//添加用戶名
cv.put("password","ilovepopmusic"); //添加密碼
db.insert("user",null,cv);//執行插入操作
2.使用execsql方式來實現
1
2
string sql = "insert into user(username,password) values ('jack johnson','ilovepopmuisc');//插入操作的sql語句
db.execsql(sql);//執行sql語句
數據的刪除
同樣有2種方式可以實現
1
2
3
string whereclause = "username=?";//刪除的條件
string[] whereargs = {"jack johnson"};//刪除的條件參數
db.delete("user",whereclause,whereargs);//執行刪除
使用execsql方式的實現
1
2
string sql = "delete from user where username='jack johnson'";//刪除操作的sql語句
db.execsql(sql);//執行刪除操作
數據修改
同上,仍是2種方式
1
2
3
4
5
contentvalues cv = new contentvalues();//實例化contentvalues
cv.put("password","ihatepopmusic");//添加要更改的欄位及內容
string whereclause = "username=?";//修改條件
string[] whereargs = {"jack johnson"};//修改條件的參數
db.update("user",cv,whereclause,whereargs);//執行修改
使用execsql方式的實現
1
2
string sql = "update [user] set password = 'ihatepopmusic' where username='jack johnson'";//修改的sql語句
db.execsql(sql);//執行修改
數據查詢
數據查詢相對前面幾種方法就復雜一些了,因為查詢會帶有很多條件
通過query實現查詢的
public cursor query(string table, string[] columns, string selection, string[] selectionargs, string groupby, string having, string orderby, string limit)
各參數說明:
table:表名稱
colums:列名稱數組
selection:條件子句,相當於where
selectionargs:條件語句的參數數組
groupby:分組
having:分組條件
orderby:排序類
limit:分頁查詢的限制
cursor:返回值,相當於結果集resultset
針對游標(cursor)也提供了不少方法
方法名稱
方法描述
getcount() 總記錄條數
isfirst() 判斷是否第一條記錄
islast() 判斷是否最後一條記錄
movetofirst() 移動到第一條記錄
movetolast() 移動到最後一條記錄
move(int offset) 移動到指定的記錄
movetonext() 移動到嚇一條記錄
movetoprevious() 移動到上一條記錄
getcolumnindex(string columnname) 獲得指定列索引的int類型值
實現代碼
1
2
3
4
5
6
7
8
cursor c = db.query("user",null,null,null,null,null,null);//查詢並獲得游標
if(c.movetofirst()){//判斷游標是否為空
for(int i=0;i
string username = c.getstring(c.getcolumnindex("username");
string password = c.getstring(c.getcolumnindex("password"));
}
}
通過rawquery實現的帶參數查詢
1
2
3
4
cursor c = db.rawquery("select * from user where username=?",new stirng[]{"jack johnson"});
if(cursor.movetofirst()) {
string password = c.getstring(c.getcolumnindex("password"));
}
5. 相冊怎麼設置密碼oppo
在oppo手機相冊中設置密碼,可以通過以下步驟來實現:
1. 打開相冊,選擇要加密的相冊。
2. 點豎沖擊右上角的「...」或「更多」選項。
3. 選擇「加密」或「設置密碼」選項,然後輸入想要設置的密碼並確認。
4. 成功設置密拍纖鄭碼後,下次進入該相冊時需要輸入密碼才能查看其中的圖片或視頻。
需要注意的是,設置密碼後一定要妥善保管好密碼,否則如果忘記密碼就無法訪問相冊內的圖片或視頻。此外,如果之後要取消密碼保護也可以通過「更多」選項襲頌來取消該相冊的密碼設置。
6. android 數據存儲的幾種方式
總體的來講,數據存儲方式有三種:一個是文件,一個是資料庫,另一個則是網路。其中文件和資料庫可能用的稍多一些,文件用起來較為方便,程序可以自己定義格式;資料庫用起稍煩鎖一些,但它有它的優點,比如在海量數據時性能優越,有查詢功能,可以加密,可以加鎖,可以跨應用,跨平台等等;網路,則用於比較重要的事情,比如科研,勘探,航空等實時採集到的數據需要馬上通過網路傳輸到數據處理中心進行存儲並進行處理。 對於android平台來講,它的存儲方式也不外乎這幾種,按方式總體來分,也是文件,資料庫和網路。但從開發者的角度來講它可以分為以下五種方式: 1.sharedpreferences共享偏好 2.internal storage內部存儲空間 3.external storage外部存儲空間 4.sqlite database資料庫 5.internet網路 這幾種方式各自有各自的優點和缺點,要根據不同的實際情況來選擇,而無法給出統一的標准。下面就各種方式談談它們的優缺點,以及最合適的使用情況: 1.shared preferences共享偏好 sharedpreferences是用來存儲一些key/value類似的成對的基本數據類型,注意,它只能存儲基本數據類型,也即int, long, boolean, string, float。事實上它完全相當於一個hashmap,唯一不同的就是hashmap中的value可以是任何對象,而sharedpreferences中的值只能存儲基本數據類型(primitive types)。 對於它的使用方法,可以參考android developer guide,這里不重復。 如此來看,最適合sharedpreferences的地方就是保存配置信息,因為很多配置信息都是key/value。事實上,在android當中sharedpreferences使用最多的地方也是用來保存配置(settings)信息,系統中的settings中這樣,各個應用中的settings也是這樣。並且,android中為了方便的使用sharedpreferences保存配置信息,它來專門有preferenceactivity用來封裝。也就是說如果你想在應用程序中創建配置(settings),你可以直接使用preferenceactivity和一些相關的專門為preference封裝的組件,而不用再直接去創建,讀取和保存sharedpreference,framework中的這些組件會為你做這些事。 再談談一些使用sharedpreference時的技巧,它只能保存基本數據類型,但假如我想保存一個數組,怎麼辦?可以把數據進行處理,把它轉化成一個string,取出的時候再還原就好了;再如,如想保存一個對象,怎麼辦,同樣,可以把對象序列化成為字元序列,或轉成string(object.tostring()),或是把它的hashcode(object.hashcode())當成value保存進去。 總之,sharedpreferences使用起來十分的方便,可以靈活應用,因為它簡單方便,所以能用它就盡量不要用文件或是資料庫。 1.internal storage內部存儲空間 所謂的內部存儲與外部存儲,是指是否是手機內置。手機內置的存儲空間,稱為內部存儲,它是手機一旦出廠就無法改變,它也是手機的硬體指標之一,通常來講手機內置存儲空間越大意味著手機價格會越貴(很多地方把它稱為手機內存,但我們做軟體的知道,這並不準確,內存是指手機運行時存儲程序,數據和指令的地方;這里應該是手機內部存儲的簡稱為內存,而並非嚴格意義上的內存)。 內部存儲空間十分有限,因而顯得可貴,所以我們要盡可能避免使用;另外,它也是系統本身和系統應用程序主要的數據存儲所在地,一旦內部存儲空間耗盡,手機也就無法使用了。所以對於內部存儲空間,我們要盡量避免使用。上面所談到的shared preferences和下面要談到的sqlite資料庫也都是存儲在內部存儲空間上的。 android本身來講是一個linux操作系統,所以它的內部存儲空間,對於應用程序和用戶來講就是「/data/data"目錄。它與其他的(外部的存儲)相比有著比較穩定,存儲方便,操作簡單,更加安全(因為可以控制訪問許可權)等優點。而它唯一的缺點就是它比較有限,比較可貴。 雖然,可以非常容易的知道程序本身的數據所在路徑,所有的應用程序的數據路徑都是「/data/data/app-package-name/」,所有的程序用到的數據,比如libs庫,sharedpreferences都是存放在這個路徑下面。但我們在使用的時候最好不要,或是千萬不要直接引用這個路徑。 使用內部存儲主要有二個方式,一個是文件操作,一個是文件夾操作。無論哪種方式,context中都提供了相應的函數來支持,使用context不但操作簡單方便,最重要的是context會幫助我們管理這些文件,也可以方便幫助我們控制文件的訪問許可權。先來系統的說下context中關於文件和文件夾操作的函數有哪些。 a. 創建一個文件,並打開成一個文件輸出流,需要提供一個string,作為文件名 1.fileoutputstream output = context.openoutputfile(filename, context.mode_private); 2.output.write(data);// use output to write whatever you like 3.output.close(); 1.fileoutputstream output = context.openoutputfile(filename, context.mode_private); output.write(data);// use output to write whatever you like output.close(); b. 同樣,想打開一個文件作為輸入的話,也是只需要提供文件名 1.fileinputstream input = context.openinputfile(filename); 2.input.read(); 3.input.close(); 1.fileinputstream input = context.openinputfile(filename); input.read(); input.close(); c. 列出所有的已創建的文件 1.string[] files = context.filelist(); 2.for (string file : files) { 3. log.e(tag, "file is " file); 4.} 1.string[] files = context.filelist(); for (string file : files) { log.e(tag, "file is " file); } d. 刪除文件,能創建就要能夠刪除,當然也會提供了刪除文件的介面,它也非常簡單,只需要提供文件名 1.if (context.deletefile(filename)) { 2. log.e(tag, "delete file " filename " sucessfully「); 3.} else { 4. log.e(tag, "failed to delete file " filename); 5.} 1.if (context.deletefile(filename)) { log.e(tag, "delete file " filename " sucessfully「); } else { log.e(tag, "failed to delete file " filename); } e. 獲取文件已創建文件的路徑,它返回一個文件對象用於操作路徑 1.file filedir = context.getfiledir(); 2.log.e(tag, "filedir " filedir.getabsolutepath(); 1.file filedir = context.getfiledir(); log.e(tag, "filedir " filedir.getabsolutepath(); f. 創建一個目錄,需要傳入目錄名稱,它返回 一個文件對象用到操作路徑 1.file workdir = context.getdir(dirname, context.mode_private); 2.log.e(tag, "workdir " workdir.getabsolutepath(); 1.file workdir = context.getdir(dirname, context.mode_private); log.e(tag, "workdir " workdir.getabsolutepath(); g. 以file對象方式查看所創建文件,需要傳入文件名,會返迴文件對象 1.file store = context.openfilestreampath(filename); 2.log.e(tag, "store " store.length()); 1.file store = context.openfilestreampath(filename); log.e(tag, "store " store.length()); h. 獲取cache路徑,無需要傳入參數,返迴文件對象 1.file cachedir = context.getcachedir(); 2.log.e(tag, "cachedir " cachedir.getabsolutepath()); 1.file cachedir = context.getcachedir(); log.e(tag, "cachedir " cachedir.getabsolutepath()); 總結一下文件相關操作,可以得出以下三個特點: 1. 文件操作只需要向函數提供文件名,所以程序自己只需要維護文件名即可; 2. 不用自己去創建文件對象和輸入、輸出流,提供文件名就可以返回file對象或輸入輸出流 3. 對於路徑操作返回的都是文件對象。 如前所述,內部存儲空間有限,可貴,安全,穩定,所以應該用來保存比較重要的數據,比如用戶信息資料,口令秘碼等不需要與其他應用程序共享的數據。也可以用來創建臨時文件,但一定要注意及時刪除。另外,對於內部存儲還有一個非常重要的特點,那就是在應用程序被卸載時,應用程序在內部存儲空間的文件數據將全部被刪除。系統這樣做的原因很簡單,就是因為內部存儲很有限,它必須保證它的可用性,因為一旦添滿,系統將無法再正常工作。 1.external storage外部存儲空間 再來談談手機外部存儲空間,與內部存儲空間相對,外部存儲空間是指手機出廠的時候不存在,用戶在使用時候可以自由添加的外部存儲介質比如ts卡,sd卡等快閃記憶體儲介質。這些快閃記憶體介質由最初的空間小價格貴,到現在的大容量價格便宜,所以幾乎每個支持外部存儲的手機上面都有大容量(大於等於2g)的快閃記憶體卡。 android也是不例外,它完全支持外部存儲介質。其實更確切的說,它是要依賴於外部存儲卡的,因為對於android系統,如果沒有外部存儲卡,很多的系統應用無法使用,比如多媒體相關的應用程序無法使用。雖然android很依賴,但是外部存儲卡也有它自身的特點,它最大的優點就是存儲空間大,基本上你可無限制的使用,也不怎麼擔心去清除數據。就目前來看,很多程序都在使用外部存儲卡,但很少有程序去主動清理數據,所以無論你的sd卡有多大,它的可用空間卻越來越少。與內部存儲不同的是,當程序卸載時,它在外部存儲所創建的文件數據是不會被清除的。所以清理外部存儲空間的責任丟給了用戶自己,每隔一段時間就去查看下sd卡,發現無用數據立馬刪除。外部存儲的缺點就是不是很穩定,對於android手機來講可以說,很不穩定,本身快閃記憶體介質就容易出問題,sd卡處於不能正常使用的狀態十分多。 先來說說外部存儲相關的使用方法和api: a. check media availability檢查介質的可用性 如前所述,外部存儲介質的穩定性十分的差,所以在使用之前一定要先檢查它的可用性,如果可用再去用 view plain to clipboardprint? 1.final string state = environment.getexternalstoragestate(); 2.if (state.equals(environment.media_mounted) || state.equals(environment.media_read_only)) {// sd card is ready to us } view plain to clipboardprint? 1.final string state = environment.getexternalstoragestate(); if (state.equals(environment.media_mounted) || state.equals(environment.media_read_only)) {// sd card is ready to us } final string state = environment.getexternalstoragestate(); if (state.equals(environment.media_mounted) || state.equals(environment.media_read_only)) {// sd card is ready to us } b. get the directory獲取外部存儲卡的路徑 事實上,外部存儲卡的路徑是「/mnt/sdcard",所以你直接這樣寫去訪問也能訪問的到。鑒於可讀性和可移植性的考慮,建議這樣寫: view plain to clipboardprint? 1.file sdcarddir = environment.getexternalstoragedirectory(); view plain to clipboardprint? 1.file sdcarddir = environment.getexternalstoragedirectory(); file sdcarddir = environment.getexternalstoragedirectory(); c. for api 8 or greater, there are some other useful apis helping to manager files and directories. 如果你使用api 8(android 2.2)或者更高,那麼sdk中又多了幾個操作外部存儲文件和路徑的介面,文檔中也建議開始者更加規范的使用sd卡。比如,創建相應的目錄去存儲相應的數據,music,picture,video等。應用程序目錄也變成了"/android/data/package-name/data"。具體的使用可以參考文檔,這里不重復。當然,就像編程規范一樣,這里只是規范,你完全可以不遵守它,但出於可讀性和可移植性,還是建議按照文檔建議的去做。 下面總結一下使用時應該注意的一些和外部存儲的特點: a. 外部存儲卡不是隨時想用就能夠用的,所以一定要記得在使用之前檢查它的可用性 b. 存儲在外部存儲卡上的數據是所有應用程序都可見,用戶也可見(使用filemanager),所以安全性不是很好,雖然文檔聲稱可以在外部存儲卡上寫程序私有數據,但貌似沒用,用filemanager仍然可以刪除或編輯文件(market上面的filemanager功能都十分的強大,能讓用戶看到sd卡中的所有文件,和操作能看到的文件)。 c. android手機支持把外部存儲卡mount至pc做為u盤,當連接數據線時,這時sd卡變成了u盤連接到了另外的操作系統中。什麼意思,就是在android當中雖然有的文件屬性(隱藏,私有等),到了pc上就不一定管用了,用戶在pc上可以隨意操作文件(這就是第二點中所提及的)。 d. 如果使用外部存儲卡保存數據,一定要額外做好異常處理:外部存儲卡不可用時把數據存入哪裡;可用的時候再怎麼同步數據(這是比較頭疼的地方,可行的做法就是當sd卡不可用時不準用戶寫數據,但這用戶體驗又不是很好,但如你所知,很多應用都這么干);你的數據被破壞了。當然常見的異常也要考慮,比如空間滿了,無法寫入,磁碟壞道等。 1.sqlite database資料庫 android對資料庫的支持很好,它本身集成了sqlite資料庫,每個應用都可以方便的使用它,或者更確切的說,android完全依賴於sqlite資料庫,它所有的系統數據和用到的結構化數據都存儲在資料庫中。 它具有以下優點: a. 效率出眾,這是無可否認的 b. 十分適合存儲結構化數據 c. 方便在不同的activity,甚至不同的應用之間傳遞數據 先前有一篇文章講到了不同activity和不同應用之間傳遞數據的麻煩,特別是對於大型數據結構,因為activity雖是java對象,但去無法像使用其他類對象那樣去創建一個實例然後使用它,更無法給activity加上setters和getters(雖然這樣做了沒有編譯錯誤)。比較好的解決方案就是把結構化數據寫入資料庫,然後在不同的activity之間傳遞它們的uri。 d. 由專門的contentprovider來幫忙管理和維護資料庫 e. 可以方便的設置訪問許可權,私有還是都可見 f. 操作方便,使用標準的crude語句,contentresolver.query(), update(), delete() insert(),詳見contentresolver g. 良好的可移植性和通用性,用標準的sql語句就能實現crude 對於它的使用方法可以去參考文檔,這里也說不清楚。 1.internet網路 網路是比較不靠譜的一個,因為移動終端的網路穩定性,以及所產生的流量讓人傷不起,用戶更傷不起。但若是對於非常重要的實時數據,或是需要發送給遠端伺服器處理的,也可以考慮使用網路實時發送。這已經有先例了,apple和google就是這樣,iphone設備和android設備都會在用戶不知情的情況 下收集用戶的信息,然後又在用戶不知情的情況 下發送到apple和google的伺服器上,也就是所謂的「跟蹤門」。除此之外,智能手機(特別是android和火熱的iphone)上面的應用程序都會偷偷的在後台運行,收集用戶數據,然後再偷偷的發伺服器,直接傷害是用戶流量,請看先前的文章。 對比這幾種方式,可以總結下: 1. 簡單數據和配置信息,sharedpreference是首選; 2. 如果sharedpreferences不夠用,那麼就創建一個資料庫 3. 結構化數據,一定要創建資料庫,雖然這稍顯煩鎖,但是好處無窮 4. 文件就是用來存儲文件(也即非配置信息或結構化數據),如文本文件,二進制文件,pc文件,多媒體文件,下載的文件等等。 5. 盡量不要創建文件 6. 如果創建文件,如果是私密文件或是重要文件,就存儲在內部存儲,否則放到外部存儲 7. 不要收集用戶數據,更不要發到網路上,雖然你們也有很多無奈。用戶也無奈,也無辜,但更無助 平台為開發者准備了這么多的方式固然是一件好事,但我們要認清每一種的優點和缺點,根據實際情況選擇最合適的。還有一個原則就是最簡單原則,也就是說能用簡單的方式處理,就不要用復雜的方式。