編輯:關於Android編程
相信很懂同學都接觸過很多開源的數據庫框架,具體的就不多說了,反正給我的感覺就是,用起來總是束手束腳的,哪怕說的再好也並沒有自己做出來的那麼趁手。另外,安卓本身對數據庫的封裝已經做得很不錯了,我覺得自己封一個易用的並且好用的工具也並沒有那麼難,那麼下面進入正題。
首先說說SQLiteOpenHelper這個工具類吧,其實這個工具類網上的教程資料很多,具體使用就不多說,主要說一下我是怎麼寫的吧。先自己寫一個DatabaseHelper類繼承SQLiteOpenHelper,這裡為了更靈活我寫了兩個構造函數。代碼如下:
public class DatabaseHelper extends SQLiteOpenHelper { private static final String name = "ZPDB"; //數據庫名稱 private static final int version = 1; public DatabaseHelper(Context context) { this(context, name); } public DatabaseHelper(Context context, String dbname){ super(context, dbname, null, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement," + " name varchar(20), password varchar(20), age INTEGER)"); db.execSQL("create table if not exists story (storyid integer primary key autoincrement," + "title varchar(30), content varchar(1000), date varchar(20))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }為什麼要寫這兩個構造函數呢,第一個我用了一個默認的數據庫名稱,第二個可以自己傳入數據庫名稱。這樣做的目的是為了滿足多數據庫操作的需要,很多同學可能遇到過這個問題,比如一個聊天app,跟每個人的聊天記錄保存在不同的文件下面,而且名字也不一樣,這裡就需要能夠自己傳入數據庫名稱了。說到不同文件下面的數據庫,我們就得用到Context(上下文對象)這個玩意了。通常情況下,直接傳入上下文對象,則數據庫默認保存到系統目錄下,而且是不可見的,那麼如何定義數據庫到指定位置呢?其實很簡單,我們自定義一個類,繼承ContextWrapper,代碼如下:
public class DatabaseContext extends ContextWrapper { private String path; public DatabaseContext(Context base, String path){ super(base); this.path = path; } @Override public File getDatabasePath(String name) { //判斷是否存在sd卡 boolean sdExist = android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState()); if(!sdExist){ return null; } else{//如果存在 //獲取sd卡路徑 String dbDir=android.os.Environment.getExternalStorageDirectory().toString()+"/"+path; String dbPath = dbDir+"/"+name;//數據庫路徑 //判斷目錄是否存在,不存在則創建該目錄 File dirFile = new File(dbDir); if(!dirFile.exists()) dirFile.mkdirs(); //數據庫文件是否創建成功 boolean isFileCreateSuccess = false; //判斷文件是否存在,不存在則創建該文件 File dbFile = new File(dbPath); if(!dbFile.exists()) { try { isFileCreateSuccess = dbFile.createNewFile();//創建文件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { isFileCreateSuccess = true; } //返回數據庫文件對象 if(isFileCreateSuccess) return dbFile; else return null; } } @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) { SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null); return result; } @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) { SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null); return result; } }構造函數中的path就是你想保存的數據庫位置。那麼具體怎麼使用呢?這樣就可以了
SQLiteOpenHelper sqlHelper = new DatabaseHelper(new DatabaseContext (context, path)); 或者 SQLiteOpenHelper sqlHelper = new DatabaseHelper(new DatabaseContext (context, path)); 或者 SQLiteOpenHelper sqlHelper = new DatabaseHelper(new DatabaseContext (context, path), dbname);
public class DatabaseManager2 { private SQLiteOpenHelper mDatabaseHelper; private SQLiteDatabase db; public DatabaseManager2(SQLiteOpenHelper sqLiteOpenHelper){ this.mDatabaseHelper = sqLiteOpenHelper; } /** for example ContentValues values = new ContentValues(); values1.put("name", "張龍"); values1.put("address", "beijing"); values1.put("sex", "male"); insert("user", values); * @param table * @param values * @return */ public boolean insert(String table, ContentValues values){ db = mDatabaseHelper.getWritableDatabase(); boolean flag = false; long id = -1; try{ id = db.insert(table, null, values); flag = id != -1; }catch (Exception e){ e.printStackTrace(); } close(); return flag; } /** for example delete("user", " id =? ", new String[]{"1"}); * @param table * @param whereClause * @param whereArgs * @return */ public boolean delete(String table, String whereClause, String[] whereArgs){ db = mDatabaseHelper.getWritableDatabase(); boolean flag = false; int count; try { count = db.delete(table, whereClause, whereArgs); flag = count > 0; } catch (Exception e) { e.printStackTrace(); } close(); return flag; } /** for example ContentValues values = new ContentValues(); values.put("name", "張三"); values.put("address", "上海"); values.put("sex", "男"); update("user", values, " id=? ", new String[]{"2"}); * @param table * @param values * @param whereClause * @param whereArgs * @return */ public boolean update(String table, ContentValues values, String whereClause,String[] whereArgs) { db = mDatabaseHelper.getWritableDatabase(); boolean flag = false; int count; try { count = db.update(table, values, whereClause, whereArgs); flag = count > 0; } catch (Exception e) { e.printStackTrace(); } close(); return flag; } /** for example view("user", " id=? ", new String[]{"2"}); * @param table * @param selection * @param selectionArgs * @return */ public Mapview(String table, String selection, String[] selectionArgs) { db = mDatabaseHelper.getReadableDatabase(); Cursor cursor = null; Map map = new HashMap (); try { cursor = db.query(true, table, null, selection,selectionArgs, null, null, null, null); int cols_len = cursor.getColumnCount(); while (cursor.moveToNext()) { for (int i = 0; i < cols_len; i++) { String cols_key = cursor.getColumnName(i); String cols_value = cursor.getString(cursor.getColumnIndex(cols_key)); if (cols_value == null) { cols_value = ""; } map.put(cols_key, cols_value); } } } catch (Exception e) { e.printStackTrace(); } if(cursor != null){ cursor.close(); } close(); return map; } /** for example listPersonMaps("user", null, null); * @param table * @param selection * @param selectionArgs * @return */ public List
Android系統中一個應用程序的主題是由ActivityThread構成的。不過涉及到很多細節如ActivityThread是由誰來創建的 又是在什麼時間創建?它和系統
這個Toast的顯示在Android中的用途還是很大的,同時我們也知道toast顯示的時間是不可控的,我們只能修改他的顯示樣式和顯示的位置,雖然他提供了一個顯示時間的設置
微信公眾號是微信公眾平台下的一個小分支,有信息推廣推送的功能,公眾號每天定時的推送相關文章或者相關活動內容,讓用戶及時了解最新動態!那麼微信公眾號怎麼申請?
一、概述一般大量圖片的加載,比如GridView實現手機的相冊功能,一般會用到LruCache,線程池,任務隊列等;那麼異步消息處理可以用哪呢?1、用於UI線程當Bitm