結構
1:Android中數據庫的創建
2:ListView的優化
3:數據庫的分頁查詢以及ListView分頁展示
1:Android中數據庫的創建
1:寫類繼承SQLiteOpenHelper
public class BlackNamedb extends SQLiteOpenHelper{
public BlackNamedb(Context context) {
super(context, "blackname.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//執行SQL語句
sqLiteDatabase.execSQL("create table blackname" +
"(_id integer primary key autoincrement,phone varchar(20),mode integer);");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {
}
}
2:重新寫類私有化構造方法
3:申明一個靜態的當前類對象
3:提供一個靜態方法如果當前類的對象為空則要創建一個新的對象
public class BlacknameJDBC {
private final BlackNamedb blackNamedb;
//1:私有化構造方法
private BlacknameJDBC(Context context) {
blackNamedb = new BlackNamedb(context);
}
//2:申明當前類的對象。必須是靜態的
private static BlacknameJDBC blacknameJDBC = null;
//3:提供一個靜態方法如果當前類的對象為空則要創建一個新的對象
public static BlacknameJDBC getInstance(Context context){
if (blacknameJDBC==null){
blacknameJDBC = new BlacknameJDBC(context);
return blacknameJDBC;
}else {
return blacknameJDBC;
}
}
4:提供增刪改查等操作
/**
*
* @param phone 攔截的電話
* @param mode 攔截的類型 1是短信 2是電話 3是所有
*/
public void insert(String phone , String mode){
//開啟數據庫做寫入操作
SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
//準備ContentValues 封裝
ContentValues values = new ContentValues();
values.put("phone",phone);
values.put("mode",mode);
//進行寫入操作 方法接收參數(表的名稱,沒有給值時,將null插入數據庫,內容 ContentValues 用這個封裝);
writableDatabase.insert("blackname",null,values);
blackNamedb.close();
}
/**
*
* @param phone 想要刪除的電話號碼
*/
public void delect(String phone){
SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
//進行刪除操作(表的名稱,要刪除的字段名稱,要刪除的字段值,要使用String類型的數組)
writableDatabase.delete("blackname","phone=?",new String[]{phone});
writableDatabase.close();
}
/**
* 根據電話號碼去更新攔截模式
* @param phone 要更新的電話
* @param mode 要更新為的模式(1:短信 2:電話 3:攔截所有(短信+電話)
*/
public void updata(String phone,String mode){
SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
//準備數據
ContentValues values = new ContentValues();
values.put("mode",mode);
// ava.lang.String table, android.content.ContentValues values, java.lang.String whereClause, java.lang.String[] whereArgs
//進行更新操作(表的名稱,要更新的值,要更新的字段,依據什么字段更新)
writableDatabase.update("blackname",values,"mode=?",new String[]{phone});
writableDatabase.close();
}
/**
* 返回的就是數據庫中所有的號碼以及類型
*/
public List<Blacknamebin> FindAll(){
SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
//查詢(表名,查詢的字段,查詢的條件,查詢的條件,查詢的條件,查詢的條件, 查詢出來排序的方法 默認為正序,desc為倒敘)
//拿到游標
Cursor query = writableDatabase.query("blackname", new String[]{"phone", "mode"}, null, null, null, null, "_id desc");
//創建一個集合
List<Blacknamebin> blackname = new ArrayList<Blacknamebin>();
while (query.moveToNext()){
//生成一個BIN類放常用字段
Blacknamebin blacknamebin = new Blacknamebin();
blacknamebin.phone = query.getString(0);
blacknamebin.mode = query.getString(1);
System.out.println("blacknamebin.phone"+query.getString(0)+"````````````blacknamebin.mode"+query.getString(1));
blackname.add(blacknamebin);
}
query.close();
writableDatabase.close();
return blackname;
}
public List<Blacknamebin> FindOther(int index){
SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
Cursor query = writableDatabase.rawQuery("select phone,mode from blackname order by _id desc limit ?,10;", new String[]{index+""});
List<Blacknamebin> blackname = new ArrayList<Blacknamebin>();
while (query.moveToNext()){
//生成一個BIN類放常用字段
Blacknamebin blacknamebin = new Blacknamebin();
blacknamebin.phone = query.getString(0);
blacknamebin.mode = query.getString(1);
System.out.println("blacknamebin.phone"+query.getString(0)+"````````````blacknamebin.mode"+query.getString(1));
blackname.add(blacknamebin);
}
query.close();
writableDatabase.close();
return blackname;
}
public int getCount(){
SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
Cursor cursor = writableDatabase.rawQuery("select count(*) from blackname;", null);
int count =0 ;
if (cursor.moveToNext()){
count = cursor.getInt(0);
}
cursor.close();
writableDatabase.close();
return count;
}
}
2:ListView的優化
listView優化
1:復用convertView
2:復用ViewHolder讓其減少findViewById()次數
3:static ViewHolder
4:分頁算法
模版代碼
ViewHolder viewHolder = null;
if(convertView == null){
viewHolder = new ViewHolder();
convertView = View.inflate();
viewHolder.text1 = convertView.findViewById(R.id.text1);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder)convertView.getTag();
}
viewHolder.text1.setText("文本內容");
static class ViewHolder{
TextView text1;
}
3:數據庫的分頁查詢以及ListView分頁展示
1:數據庫查詢指定數據寫法
public List<Blacknamebin> FindOther(int index){
SQLiteDatabase writableDatabase = blackNamedb.getWritableDatabase();
Cursor query = writableDatabase.rawQuery("select phone,mode from blackname order by _id desc limit ?,10;", new String[]{index+""});
List<Blacknamebin> blackname = new ArrayList<Blacknamebin>();
while (query.moveToNext()){
//生成一個BIN類放常用字段
Blacknamebin blacknamebin = new Blacknamebin();
blacknamebin.phone = query.getString(0);
blacknamebin.mode = query.getString(1);
blackname.add(blacknamebin);
}
query.close();
writableDatabase.close();
return blackname;
}
2:監聽ListView的滾動事件重寫里面的onScrollStateChanged方法
lv_black_name.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
//滾動過程中狀態發生改變
//SCROLL_STATE_IDLE 空閑狀態
//SCROLL_STATE_TOUCH_SCROLL 拿手觸摸著滾動滾動狀態
// SCROLL_STATE_FLING 飛速滾動
條件:
//1:LV不能滾動
//2:最后一個條目可見(最后一個條目的索引值大于數據適配器中條目值-1)
//3:mIsload 這個是為了不重復加載
if (blacknamebins != null) {
if (i == AbsListView.OnScrollListener.SCROLL_STATE_IDLE &&
lv_black_name.getLastVisiblePosition() >= blacknamebins.size() - 1 &&
!mIsload)
{
//mCount返回的是數據庫中總條目的個數
if (mCount>blacknamebins.size()){
//開啟線程加載數據
new Thread(){
@Override
public void run() {
//獲取數據庫查詢對象
blacknameSelect = BlacknameJDBC.getInstance(Blackname_Activity.this);
List<Blacknamebin> moreData = blacknameSelect.FindOther(blacknamebins.size());
blacknamebins.addAll(moreData);
mHandler.sendEmptyMessage(0);
super.run();
}
}.start();
}
}
}
}
@Override
public void onScroll(AbsListView absListView, int i, int i2, int i3) {
//滾動過程中調用的方法
}
});
3:通知數據適配器實時刷新調用API
if (mAdapter!=null){
mAdapter.notifyDataSetChanged();
}