編輯:關於Android編程
Android項目開發過程中經常使用到SQLite數據對數據進行存儲,每個app都會有各自的數據DB,以及各種表項。這就意味著每次進行app開發都要編寫數據庫以及表項的創建代碼,而這些建庫建表代碼量往往不少,但是大多雷同,只是具體數據不一樣。僅僅拷貝後,替換都覺得麻煩。
為何不將建庫建表封裝起來呢?下次建庫或者建表時只用配置對應的數據庫名,表名以及表屬性字段即可。
1,建庫建表
簡單來說SQLite建表就是利用SQLiteDatabase獲取DBOpenHelper 來執行相應的建表SQL語句即可。SQLiteDatabase對象容易獲取,建庫只用一條拼接後的SQL建庫一句即可,而一個庫中可以存在多張表,每張表的建表語句有些微的不同(應為表字段有差異),故建表語句數對應了需要創建的表數。下面在代碼中體現與說明建庫建表過程。
package com.ws.coyc.wsnote.SQLiteHelper;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import com.ws.coyc.wsnote.SQLiteHelper.Utils.l;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by coyc on 16-8-23.
* before use the SDK you should do SQLiteManager.init();
* then you can create table by SQLiteManager.crateTable();
*/
public class SQLiteManager {
/*
member
*/
// SQLite
public SQLiteDatabase db;//數據庫操作對象
private Context context; //上下文
private DBOpenHelper dbOpenHelper;//建表所需的幫助類(不懂的另外百度)
private class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context, String name,
SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase _db) {
int size = tables.size();//獲取當前需要建表的數量
for(int i = 0;i
private ArrayList tables = new ArrayList<>();//該庫中表對象列表
/*
fun
*/
//constrat
public SQLiteManager()
{
}
//init 初始化建庫工作,傳入庫名
public void init(Context context,String DB_name)
{
tables.clear();
this.context = context;
this.DB_NAME = DB_name;
}
private static SQLiteManager instance = null;
public static SQLiteManager getInstance()//單例模式 方便外部調用
{
if(instance == null)
{
synchronized (SQLiteManager.class)
{
if(instance == null)
{
instance = new SQLiteManager();
}
}
}
return instance;
}
//open 做數據庫操作之前都要調用open方法
public void open() {
dbOpenHelper = new DBOpenHelper(context, DB_NAME, null, DB_VERSION);
try {
db = dbOpenHelper.getWritableDatabase();
} catch (SQLiteException ex) {
ex.printStackTrace();
exceptionHandler();
}
db.beginTransaction();
}
/**
* 數據庫文件損壞刪除異常處理
*
*/
private void exceptionHandler() {
if(db == null)
{
return;
}
File file = new File(db.getPath());
if (!file.exists()) {
try {
if (file.createNewFile()) {
open();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//close 長時間不適用數據庫可執行close方法關閉數據庫
public void close() {
db.setTransactionSuccessful();
db.endTransaction();
if (db != null) {
db.close();
db = null;
}
}
//create table 注冊表 外界任何想在該庫下創建的表都必須注冊 注冊後tables列表會增加,這回作用到建表時SQL語句的生成
public void registerTable(String table_name, ArrayList- items)
{
Table table = new Table(table_name,"_id",items);
tables.add(table);
}
//兩種不同的注冊方式 建議使用第二種方式進行注冊,因為第二種方式的表對象是外界傳入的,外界可以利用該對象進行更多的操作。詳情見下
public void registerTable(Table table)
{
tables.add(table);
}
// get table create sql by items 建表語句拼接代碼 遍歷tables列表,由於每個表又可以有多個字段,故字段類型不同又有對應的語句區別。
private static String getTableCreateSQLString(Table table) {
String sql = "create table "+table.table_name;//表名 下面依次是“主鍵”+“item1”+“item2”+.....+"item n" 拼接代碼原理不熟的百度能搜出一大把,這裡只是稍微換了一種形式的寫法。
sql += "("+table.keyItem+" integer primary key autoincrement";
int size = table.items.size();
for(int i = 0;i
Android開啟多進程
1. 為何要開啟多進程為何開啟android應用要開啟多進程,主要有以下幾點:單進程所分配的內存不夠,需要更多的內存。在早期android系統只為一個單進程的應用分配了1
Android 02 Started Service--之被啟動的服務
正文 1 Started Service介紹 Started Service,即被啟動的服務。它是2種常見服務之一,另一種是Bo
Android 進度條使用詳解及示例代碼
在這裡,總結一下loading進度條的使用簡單總結一下。一、說起進度條,必須說說條形進度條,經常都會使用到嘛,特別是下載文件進度等等,還有像騰訊QQ安裝進度條一樣,有個進
AsyncTask源碼分析
前置內容:Callable、Future、FutureTask Executor子類的execute方法接收一個Runnable作為參數,會在新線程中執行Ru