編輯:關於android開發
本章繼續講解在Android開發中,數據的存儲與管理。涉及知識點:SQLite,SwipeRefreshLayout控件刷新。
練習使用SQLite
圖1
圖2
圖3
圖4
圖5
簡要說明:通過左側滑動導航界面(圖5),可以選擇登陸頁面(圖1)和登陸列表頁面(圖2)。在登陸成功後,會跳轉到登錄列表界面。通過選擇退出,可清除當前用戶的登錄狀態。登錄列表,下拉界面可以刷新頁面信息(圖3)。
SQLite,是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域項目。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。
SQLite由以下幾個部分組成:SQL編譯器、內核、後端及附件。SQLite通過利用虛擬機和虛擬數據庫引擎(VDBE),是調試、修改和擴展SQLite的內核變得更加方便。所有SQL語句都被編譯成易讀的、可以在SQLite虛擬機中執行的程序集。SQLite的整體結構圖如下:
SQLite在數據類型存儲方面,目前支持如下類型字段: VARCHAR(10),NVARCHAR(15),TEXT,INTEGER,FLOAT,BOOLEAN,CLOB,BLOB,TIMESTAMP,NUMERIC(10,5),VARYING CHARACTER (24),NATIONAL VARYING CHARACTER(16)。
Android項目中,數據庫生成後,存儲在/data/data/[PACKAGE_NAME]/databases目錄下。
以上方法的第一個參數是表示要操作的表名;
insert中的第二個參數表示如果插入的數據每一列都為空的話,需要指定此行中某一列的名稱,系統將此 列設置為NULL,不至於出現錯誤;
insert中的第三個參數是ContentValues類型的變量,是鍵值對組成的Map,key代表列 名,value代表該列要插入的值;
update的第二個參數也很類似,只不過它是更新該字段key為最新的value值,
第三個參數 whereClause表示WHERE表達式,比如“age > ? and age < ?”等,最後的whereArgs參數是占位符的實際參數值;
delete方法的參數和update一樣;
db.query傳入各種參數表示查詢,他們同時返回一個Cursor對象,代表數據集的游標。
除以上基本sql操作語句外,SQLite還支持事務操作,如以下操作使用:
1 public void TestTransaction(List<Person> persons) { 2 db.beginTransaction(); //開始事務 3 try { 4 for (Person person : persons) { 5 db.execSQL("INSERT INTO person VALUES(null, ?, ?, ?)", new Object[]{person.name, person.age, person.info}); }
db.setTransactionSuccessful(); //設置事務成功完成 6 } finally { 7 db.endTransaction(); //結束事務 8 } 9 }
各種下拉控件,下拉操作在Android開發中,已經是層出不窮。google終於忍不住推出了自己的下拉組件SwipeRefreshLayout,它很輕巧,很靈活,操作很簡單。
swipeRefreshLayout這個類是在放在 android-support-v4.jar裡面的。SwipeRefreshLayout組件只接受一個子組件:即需要刷新的那個組件。它使用一個偵聽機制來通知擁有該組件的監聽器有刷新事件發生,換句話 說我們的Activity必須實現通知的接口。該Activity負責處理事件刷新和刷新相應的視圖。一旦監聽者接收到該事件,就決定了刷新過程中應處理 的地方。如果要展示一個“刷新動畫”,它必須調用setRefrshing(true)
,否則取消動畫就調用setRefreshing(false)
。
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/sr" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" <FrameLayout android:id="@+id/fl_content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/line" /> </RelativeLayout> </android.support.v4.widget.SwipeRefreshLayout>
sr = (SwipeRefreshLayout) findViewById(R.id.sr); sr.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); sr.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { appLoginDetailFragment(); //需要刷新時的操作 sr.setRefreshing(false); } });
Android數據庫操作項目Demo結構圖如下所示:
數據庫處理放在db包,dbhelper是建立數據庫的基本操作,包括建表語句;clssqlite表示提供數據庫查詢,打開等通用操作模板。
登錄處理要求:模擬登錄成功後,將登錄的用戶名及登錄狀態(登錄中)寫入數據庫,保存所有用戶登錄的歷史,但一個用戶名只保留一條記錄。所以在登錄處理時,需要先檢查數據表中是否含該登錄賬戶的信息,核心代碼如下:
1 private void init() 2 { 3 try { 4 db = new clssqlite(); 5 db.openDB(getActivity()); 6 login_on.setOnClickListener(new View.OnClickListener() { 7 @Override 8 public void onClick(View arg0) { 9 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 這裡的格式可以自己設置 10 // format()方法是用來格式化時間的方法 11 Date datenow = new Date(); 12 String returnTime = format.format(datenow); 13 String account = operator.getText().toString(); 14 String passwords = password.getText().toString(); 15 //檢測是否含有該賬戶 16 int loginstatus = db.checklogin("select count(*) as data from LoginData where account='"+account+"' "); 17 try {Thread.sleep(400); 18 } catch (InterruptedException e) { 19 e.printStackTrace();} 20 String sql = "insert into LoginData (account,password,loginstatus,logintime) values ('" + account + "','" + passwords + "',1,'" + returnTime + "') "; 21 if (loginstatus > 0) 22 sql = "update LoginData set loginstatus=1 , logintime='" + returnTime + "' where account='"+account+"' "; 23 db.openDB(getActivity()); 24 if(db.executeSQL(sql)>=0) 25 { 26 //保存登錄名 27 result.setText("登錄成功"); 28 account_save.edit().putString("account", account).commit(); 29 ((MainActivity) mContext).appLoginDetailFragment(); 30 ((MainActivity) mContext).setToolbarTitle("登錄列表"); 31 }else { 32 result.setText("登錄失敗"); 33 }} 34 }); 35 }catch (Exception ex) 36 { 37 result.setText("登錄異常");} 38 }
這個知識利用上一章的SharedPreferences存儲即可,在登錄成功後,根據代碼account_save.edit().putString("account", account).commit();完成用戶名保存。
在退出操作時,需要先驗證用戶是否已經登錄了,若登錄了,更新數據表中的登錄狀態字段即可。核心代碼如下:
1 public boolean onOptionsItemSelected(MenuItem item) { 2 int id = item.getItemId(); 3 //退出處理 4 if (id == R.id.action_loginoutmode) { 5 db.openDB(this); 6 String account=LoginFragment.account_save.getString("account","00000"); 7 int loginstatus = db.checklogin("select count(*) as data from LoginData where account='"+account+"' and loginstatus=1 "); 8 if(loginstatus>0) 9 { 10 String sql="update LoginData set loginstatus=0 where account='"+account+"' "; 11 db.openDB(this); 12 db.executeSQL(sql); 13 appLoginDetailFragment(); 14 Toast.makeText(getApplicationContext(), "退出登錄成功", Toast.LENGTH_SHORT).show(); 15 } 16 else 17 { 18 Toast.makeText(getApplicationContext(), "還未登錄", Toast.LENGTH_SHORT).show(); 19 } 20 } 21 return super.onOptionsItemSelected(item); 22 }
登錄狀態展示是把數據表中存儲的字段信息,展示在界面上。其中,對於頁面刷新操作,當listview拉動到頂部時,觸發刷新事件,相關代碼如下:
1 listView.setOnScrollListener(new AbsListView.OnScrollListener() { 2 @Override 3 public void onScrollStateChanged(AbsListView view, int scrollState) { 4 } 5 @Override 6 public void onScroll(AbsListView view, int firstVisibleItem, 7 int visibleItemCount, int totalItemCount) { 8 if (listView != null && listView.getChildCount() > 0) { 9 boolean enable = (firstVisibleItem == 0) && (view.getChildAt(firstVisibleItem).getTop() == 0); 10 //調用刷新控件 11 ((MainActivity) mContext).setSwipeRefreshEnable(enable); 12 } 13 } 14 });
本項目源代碼在360雲盤上,開發環境為 Android Studio 2.0 beta 7。
https://yunpan.cn/cYamkZG3sq9jf 訪問密碼 f3d5。文件名稱:android數據庫存儲操作demo。
android Fragment詳細講述,包括問題隱患 Fragment是安卓v4包的新東西,名為碎片化布局,該布局的目的就是為了取代過時的tabhost.使操作更加方便
FloatingActionButton增強版,一個按鈕跳出多個按鈕--第三方開源--FloatingActionButton,floatingactionbutton&
ListFragment的使用,ListFragment使用ListFragment繼承了Fragment,顧名思義,ListFragment是一種特殊的Fragment
Android 指紋認證,android指紋認證安卓指紋認證使用智能手機觸摸傳感器對用戶進行身份驗證。Android Marshmallow(棉花糖)提供了一套API,使