編輯:關於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 Map view(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應用程序的啟動流程
Android系統中一個應用程序的主題是由ActivityThread構成的。不過涉及到很多細節如ActivityThread是由誰來創建的 又是在什麼時間創建?它和系統
Android中通過反射來設置顯示時間
這個Toast的顯示在Android中的用途還是很大的,同時我們也知道toast顯示的時間是不可控的,我們只能修改他的顯示樣式和顯示的位置,雖然他提供了一個顯示時間的設置
微信公眾號 微信公眾號怎麼申請 微信公眾號申請 微信公眾賬號申請
微信公眾號是微信公眾平台下的一個小分支,有信息推廣推送的功能,公眾號每天定時的推送相關文章或者相關活動內容,讓用戶及時了解最新動態!那麼微信公眾號怎麼申請?
Android App中實現圖片異步加載的實例分享
一、概述一般大量圖片的加載,比如GridView實現手機的相冊功能,一般會用到LruCache,線程池,任務隊列等;那麼異步消息處理可以用哪呢?1、用於UI線程當Bitm