SQLite是一款精簡的SQL工具,占用的系統資源較小,對SQL的支持全面。
Android提供android.database和android.database.sqlite這兩個包用於對數據庫的支持。
1 數據庫管理:
可視為對文件的管理,創建庫文件需要在SD卡上創建文件或文件夾,所以需要在工程清單文件(AndroidManifest.xml)中聲明允許寫外部存儲器的許可。如以下代碼所示:
<uses-permission android:name=”android.perminssion.WRITE_EXTERNAL_STORAGE”/>
通過 SQLiteDatabase類中的openOrCreateDatabase方法按照指定路徑在文件系統中創建一個數據庫,並返回該數據庫的實例對象;使用“close”方法關閉數據庫
2 數據庫模式管理:
(1)創建或刪除數據表:
如:private void execCreateTableSQL()
{
String sql=“CREATE TABLE”+ tablename+ “(_id INTEGER PRIMARY KEY,”;
//生成SQL語句的
//以讀寫方式打開數據庫
SQLiteDatabase db=SQLiteDatabase.openDatabase(SQLiteDBAct.DB_NAME, null , SQLiteDatabase.OPEN_READWRITE);
//執行SQL語句
db.execSQL(sql);
//關閉數據庫
Db.close();
}
基本流程是:打開數據庫,執行SQL語句進行各項操作,關閉數據庫
SQLite數據庫打開標識
標識類型
說明
CREATE_IF_NECESSARY
按需創建
NO_LOCALIZED_COLLATORS
不使用本地化校驗
OPEN_READONLY
只讀方式
OPEN_READWRITE
讀寫方式
(2)獲取數據表
//初始化列表項目
private void initList(String table_name)
{
String[] columnNames = { "sql" };
//以只讀方式打開數據庫
SQLiteDatabase db = SQLiteDatabase.openDatabase(SQLiteDBAct.DB_NAME, null,
SQLiteDatabase.OPEN_READONLY);
//按照指定條件查詢數據表【sqlite_master】中指定的列
Cursor cursor = db.query("sqlite_master",columnNames,
"(tbl_name='"+table_name+"')",null,null,null,null);
if (cursor.getCount() == 1)
{
//保證游標復位
cursor.moveToFirst();
//獲取用於創建數據表的列名
String sql = cursor.getString(0);
//通過表名獲取數據表的列名
String[] allColumnNames = getTableColumnNames(db, table_name);
//解析SQL語句
List<String> sqlParts = parseSQL(sql);
for (int i = 0; i < allColumnNames.Length; ++i)
{
//獲取各列的類型名
String type = getColumnTypeByName(sqlParts, allColumnNames[i]);
//............
}
//關閉游標
cursor.close();
db.close();
}
}
//獲取指定表的全部列名
private String[] getTableColumnNames(SQLiteDatabase db, String tableName)
{
Cursor cursor = db.query(tableName, null, "(0>1)", null, null, null, null);
String[] columnNames = cursor.getColumnNames();
cursor.close();
return (columnNames);
}
//解析SQL語句
private List<String> parseSQL(String sql)
{
Pattern p = Pattern.compile("[A-Za-z0-9_]+");
Matcher m = p.matcher(sql);
List<String> sqlParts = new List<string>();
while (m.find())
{
sqlParts.add(m.group());
}
return sqlParts;
}
//獲取指定列的類型
private String getColumnTypeByName(List<String> items, String columnName)
{
int index = indexOf(items, columnName);
if (index == -1)
{
return "";
}
String type = items.get(index + 1).toString();
if (type.ToUpperCase().indexOf("CHAR") != -1)
{
type += ("(" + items.get(index + 2) + ")");
}
return type;
}