作為android開發者,我們知道其有五種儲存方法:
1)網路儲存
2)檔案儲存
3)SharedPreferences
4)ContentProvider
5)SQLite資料庫
以上除了網路儲存是將資料儲存在後臺外,其餘的都是基於本地的。在這裡我主要講解android SQLite資料庫的使用以及使用sqlite打造一個草稿箱的功能。sqlite是一種關係型資料庫,體積小執行庫,其api也比較簡單,可執行sql語句。
一般的,我們使用 SQLite資料庫,首先我們需要建立一個類然後繼承SQLiteOpenHelper這個抽象類,其預設需要重寫實現onCreate和onUpgrade抽象方法,還需要建立一個類的建構函式。
public class CustomDatabaseHelper extends SQLiteOpenHelper {
//建立表
public static final String DATA_DRAFTS = "create table drafts ("
+ "drafts_id integer primary key autoincrement, "
+ "uers_id varchar, "
+ "title varchar, "
+ "content varchar, "
+ "tag_id varchar)";
public CustomDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATA_DRAFTS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
複製程式碼
使用CustomDatabaseHelper的時候,會在onCreate中執行DATA_DRAFTS這條語句就會建立drafts這個表。 使用的時候,利用建構函式,將上下文context、資料庫名字和版本號傳進來就可以了,SQLiteOpenHelper和檢測有沒有該資料庫,如果沒有就會建立資料庫並且呼叫onCreate方法,如果存在資料庫並且資料庫的版本號大於當前版本號就會升級資料庫,也就是會呼叫onUpgrade方法。
dbHelper = new CustomDatabaseHelper(this, "Drafts.db", null, 1);
複製程式碼
sqlite資料庫是支援sql程式設計的,當然其本身也提供了非常方便的資料庫操作的api。 插入資料:
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues v = new ContentValues();
v.put("uers_id", "001");
v.put("title", "my first drafts");
v.put("content", "hello world");
v.put("tag_id", "ox001");
db.insert("drafts", null, v);
複製程式碼
更新資料db.update方法,刪除資料db.delete方法,查詢資料db.query方法。
接下來介紹運算元據庫的另一種方式以及使用這種方式建立一個草稿箱。 首先建立一個資料庫管理類DraftsDatabaseHelper,定義一些變數和sql資料。
private Context mContext;
//存放路徑
public static String DATABASE_PATH = Utils.getSdcardPath() ;//資料庫存放路徑
public static final String DATABASE_NAME = "drafts.db";
public static final String DRAFTS_TABLE = "drafts";
public static final String DRAFTS_ID = "drafts_id";
public static final String DRAFTS_TITLE = "title";
public static final String DRAFTS_CONTENT = "content";
public static final String TAG_ID = "tag_id";
//建立表
public static final String CREATE_DRAFTS = "CREATE TABLE IF NOT EXISTS "+DRAFTS_TABLE+"("
+ DRAFTS_ID+" integer primary key autoincrement, "
+ USER_ID+" varchar, "
+ DRAFTS_TITLE+" varchar, "
+ DRAFTS_CONTENT+" varchar , "
+ TAG_ID+" varchar )";
private static SQLiteDatabase sDatabase;
private static String sCurrentDir;
複製程式碼
//開啟資料庫
private static SQLiteDatabase openDatabase(String dir){
if (dir == null)
return null;
File file = new File(dir);
if (!file.exists()) {
if (!file.mkdirs()) {
return null;
}
}
if (sCurrentDir != null && sCurrentDir.equals(dir) && sDatabase != null && sDatabase.isOpen()) {
return sDatabase;
}
try {
if (sDatabase != null && sDatabase.isOpen()) {
sDatabase.close();
}
sDatabase = null;
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dir + "/" + DATABASE_NAME, null);
db.execSQL(CREATE_DRAFTS);
Cursor cursor = db.query(DRAFTS_TABLE, null, null, null, null, null, null);
String[] columnNames = cursor.getColumnNames();
cursor.close();
String strColumns = "";
if (columnNames != null) {
for (int i = 0; i < columnNames.length; i++) {
strColumns += columnNames[i] + ",";
}
}
if (!strColumns.contains(DRAFTS_ID))
db.execSQL("ALTER TABLE " + DRAFTS_TABLE + " ADD " + DRAFTS_ID + " integer");
if (!strColumns.contains(USER_ID))
db.execSQL("ALTER TABLE " + DRAFTS_TABLE + " ADD " + USER_ID + " varchar");
if (!strColumns.contains(DRAFTS_TITLE))
db.execSQL("ALTER TABLE " + DRAFTS_TABLE + " ADD " + DRAFTS_TITLE + " varchar");
if (!strColumns.contains(DRAFTS_CONTENT))
db.execSQL("ALTER TABLE " + DRAFTS_TABLE + " ADD " + DRAFTS_CONTENT + " varchar");
if (!strColumns.contains(TAG_ID))
db.execSQL("ALTER TABLE " + DRAFTS_TABLE + " ADD " + TAG_ID + " varchar");
sDatabase = db;
sCurrentDir = dir;
return db;
} catch (Exception e) {
System.out.println("" + e.getMessage());
}
return null;
}
複製程式碼
//插入資料
public static boolean add(String dir, CircleInfo.DraftsInfo info) {
if (info == null) {
return false;
}
SQLiteDatabase db = openDatabase(dir);
if (db != null) {
db.beginTransaction();
try {
ContentValues values = new ContentValues();
values.put(USER_ID, info.drafts_user_id);
values.put(DRAFTS_TITLE, info.drafts_title);
values.put(DRAFTS_CONTENT, info.drafts_content);
values.put(TAG_ID,info.tagId);
db.insert(DRAFTS_TABLE,null,values);
} catch (SQLiteConstraintException e) {
e.printStackTrace();
}
db.setTransactionSuccessful();
db.endTransaction();
return true;
}
return false;
}
複製程式碼
//更新資料
public static boolean update(DraftsInfo info, String rootDir) {
if (StrUtils.isEnpty(rootDir)) {
return false;
}
File file = new File(rootDir);
if (!file.exists()) {
if (!file.mkdirs()) {
return false;
}
}
SQLiteDatabase db = openDatabase(rootDir);
if (db != null) {
try {
ContentValues values = new ContentValues();
values.put(USER_ID, info.drafts_user_id);
values.put(DRAFTS_TITLE, info.drafts_title);
values.put(DRAFTS_CONTENT, info.drafts_content);
values.put(TAG_ID,info.tagId);
db.update(DRAFTS_TABLE, values, DRAFTS_ID + "=?", new String[]{info.drafts_id + ""});
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return false;
}
複製程式碼
//刪除資料
public static boolean deleteByTagId(String tagId,String dir) {
if (dir == null || tagId == null)
return false;
File file = new File(dir);
if (!file.exists() || !file.isDirectory() ) {
return false;
}
SQLiteDatabase db = openDatabase(dir);
if (db != null) {
try {
db.delete(DRAFTS_TABLE, TAG_ID + "=?", new String[]{tagId});
return true;
} catch (Exception e) {
return false;
}
}
return false;
}
複製程式碼
//查詢資料
public static ArrayList<DraftsInfo> queryData(String path,String state) {
if (TextUtils.isEmpty(path)) {
return null;
}
String finalDir = path;
File file = new File(finalDir);
if (!file.exists()) {
if (!file.mkdirs()) {
return null;
}
}
SQLiteDatabase db = openDatabase(finalDir);
if (db != null) {
try {
Cursor cursor = db.rawQuery("select * " + " from " + DRAFTS_TABLE,null);
if (cursor != null) {
ArrayList<DraftsInfo> infos = cursorToMsgs(cursor);
cursor.close();
return infos;
}
} catch (Exception e) {
return null;
}
}
return null;
}
複製程式碼
private static ArrayList<DraftsInfo> cursorToMsgs(Cursor cursor) {
ArrayList<DraftsInfo> infos = new ArrayList<DraftsInfo>();
DraftsInfo info = null;
cursor.moveToFirst();
int columnCount = cursor.getColumnCount();
while (!cursor.isAfterLast()) {
info = new DraftsInfo();
for (int i = 0; i < columnCount; i++) {
String name = cursor.getColumnName(i);
if (name.equals(DRAFTS_ID)) {
info.drafts_id = cursor.getInt(i);
}
if (name.equals(USER_ID)) {
info.drafts_user_id = cursor.getString(i);
}
if (name.equals(DRAFTS_TITLE)) {
info.drafts_title = cursor.getString(i);
}
if (name.equals(DRAFTS_CONTENT)) {
info.drafts_content = cursor.getString(i);
}
if(name.equals(TAG_ID)){
info.tagId = cursor.getString(i);
}
}
infos.add(info);
cursor.moveToNext();
}
return infos;
}
複製程式碼
以上就是開啟sqlite資料庫的另外一種方式,以及建立的草稿箱資料庫,大家可以根據草稿箱需要,新增自己業務所需要的欄位進行儲存。使用的時候只需要提供資料庫的存放路徑即可。這種方式主要是根據需求可以將資料庫存放在自己想要存放的地方。
使用時需要提供存放路徑,如查詢資料ArrayList<DraftsInfo> infos = DraftsDatabaseHelper.queryData(DraftsDatabaseHelper.DATABASE_PATH);
本文希望對大家的開發有所幫助。如果文章寫得有所不足,希望大家指出來,我會好好的更正,大家互相學習。