Android开发中关于SQLLITE数据库中SQLITE_MASTER特殊表的说明

SQLite数据库中一个特殊表名叫 SQLITE_MASTER

该表记录了相关表的创建sql及索引等信息,它定义数据库的模式。

SQLITE_MASTER 表建表语句如下:
CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);

1.对于表来说,type 字段是 ‘table’,name 字段是表的名字。

所以,要获得数据库中所有表的列表,使用下列SELECT语句:

SELECT name

FROM sqlite_master
WHERE type=’table’
ORDER BY name;

2.对于索引,type 字段是 ‘index’, name 则是索引的名字,tbl_name 是该索引所属的表的名字。

 

不管是表还是索引,sql 字段是用 CREATE TABLE 或 CREATE INDEX 语句创建它们时的命令文本。

对于自动创建的索引(用来实现 PRIMARY KEY 或 UNIQUE 约束),sql字段为NULL。

 

SQLITE_MASTER 表是只读的。不能对它使用 UPDATE、INSERT 或 DELETE。

它会被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自动更新其内容。

 

临时表不会出现在 SQLITE_MASTER 表中。临时表及其索引和触发器存放在另外一个叫 SQLITE_TEMP_MASTER 的表中。

SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多,但它只是对于创建那些临时表的应用可见。

如果要获得所有表的列表, 不管是永久的还是临时的,可以使用类似下面的命令:

SELECT

name

FROM
   (SELECT

       *

     FROM sqlite_master

     UNION ALL
     SELECT

     *

     FROM

     sqlite_temp_master)
WHERE type=’table’
ORDER BY name

其SQL語 句的格式為: create table table_name (column_name1 column_type, column_name2 column_type, …); 例如: create table Student(stud_no text primary key, stud_name text); 如果你想知道學號為‘102’以外的學生名字,可以寫如下: select stud_no, stud_name from Student where stud_no ‘102’ ; 如果你想知道學號不是‘101’,而且學生名字不是‘Linda’的資料,可以寫為: select stud_name from Student where stud_no ‘101’ and stud_name ‘Linda’; 這就把兩個格聯結起來: select Student.stud_name, Course.course_name from Student, Course where Student.stud_no = Course.stud_no; 這會進行加總了: select SUM(score1), SUM(score2) from New_Course; 還可計算平均值: select AVG(score1), AVG(score2) from New_Course New_Course 格 course_name stud_no score1 score2 DATABASE 101 70.0 74.5 ART 101 60.0 45.0 DATABASE 102 95.0 90.5 GROUP BY 子句可建立比較小的組(Group),並且對每一個組進行加總等運 算。換句話說,它產生每一組的整體性資訊。例如: select course_name, SUM(score1), SUM(score2) from New_Course group by course_name 得出結果為: course_name SUM(score1) SUM(score2) DATABASE 165.0 165.0 ART 60.0 45.0 藉由 GROUP BY 語句,可以讓 SUM()等函數對屬於一組的資料進行運算。當 你指定「GROUP BY 區域」時, 屬於同一個區域的一組資料將只會得到一行 (Column)的值。◆ private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) {} @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} } private DatabaseHelper mOpenHelper; public void onClick(View v){ if (v == btn){ mOpenHelper = new DatabaseHelper(v.getContext()); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); String sql = "create table Student(" + "stud_no text not null, " + "stud_name text );"; try { db.execSQL(sql); setTitle("create table ok!"); } catch (SQLException e) { Log.e("ERROR", e.toString()); setTitle("create table Error!"); }} if (v == btn2){ mOpenHelper = new DatabaseHelper(v.getContext()); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); String sql = "drop table Student"; try { db.execSQL(sql); setTitle("drop table ok!"); } catch (SQLException e) { Log.e("ERROR", e.toString()); setTitle("drop table Error!"); }} f (v == btn3){ mOpenHelper = new DatabaseHelper(v.getContext()); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); String sql_1 = "insert into Student (stud_no, stud_name) values('S108', 'Lily Chen');"; String sql_2 = "insert into Student (stud_no, stud_name) values('S201', 'Tom Kao');"; String sql_3 = "insert into Student (stud_no, stud_name) values('S333', 'Peter Rabbit');"; try { db.execSQL(sql_1); db.execSQL(sql_2); db.execSQL(sql_3); setTitle("insert records ok!"); } catch (SQLException e) { Log.e("ERROR", e.toString()); } } if (v == btn4){ mOpenHelper = new DatabaseHelper(v.getContext()); SQLiteDatabase db = mOpenHelper.getReadableDatabase(); String col[] = {"stud_no", "stud_name" }; cur = db.query("Student", col, null, null, null, null, null); Integer n = cur.getCount(); String ss = Integer.toString(n); setTitle(ss + " records"); cur.moveToFirst(); } if (v == btn5) finish(); }} ***************8 private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE Student(" + "stud_no" + " TEXT PRIMARY KEY," + "stud_name" + " TEXT" + ");"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} } @@@@@@@@@ if (v == btn3){ mOpenHelper = new DatabaseHelper(v.getContext()); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put("stud_no", "S108"); cv.put("stud_name", "Lily Chen"); db.insert("Student", null, cv); cv = new ContentValues(); cv.put("stud_no", "S201"); cv.put("stud_name", "Tom Kao"); db.insert("Student", null, cv); cv = new ContentValues(); cv.put("stud_no", "S333"); cv.put("stud_name", "Peter Rabbit"); db.insert("Student", null, cv); setTitle("insert record ok!"); } if (v == btn4){ mOpenHelper = new DatabaseHelper(v.getContext()); SQLiteDatabase db = mOpenHelper.getReadableDatabase(); String col[] = {"stud_no", "stud_name" }; cur = db.query("Student", col, null, null, null, null, null); Integer n = cur.getCount(); String ss = Integer.toString(n); setTitle(ss + " records"); cur.moveToFirst(); } if (v == btn5){ if(!cur.isAfterLast()){ String ss = cur.getString(0) + ", " + cur.getString(1); setTitle(ss); cur.moveToNext(); } else setTitle("======"); } if (v == btn6){ mOpenHelper = new DatabaseHelper(v.getContext()); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put("stud_no", "S288"); cv.put("stud_name", "Linda Wang"); db.update("Student", cv, "stud_no = 'S201'", null); } if (v == btn7){ mOpenHelper = new DatabaseHelper(v.getContext()); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); db.delete("Student", "stud_no = 'S108'", null); } if(v.equals(btn8)){ mOpenHelper = new DatabaseHelper(v.getContext()); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); if (db != null) db.close(); this.finish(); }}} 1. 欲新增一筆資料時,上一個範例使用 SQL 語句來達成,如下: String sql = "insert into Student (stud_no, stud_name) values ('S108', 'Lily Chen');"; db.execSQL(sql_1); 在本範例則採用另一種途徑,將資料先存入 Android的 ContentValues物件裡, 然後將此物件當成參數而傳遞給 db.insert()函數,如下: ContentValues cv = new ContentValues(); cv.put("stud_no", "S108"); cv.put("stud_name", "Lily Chen"); db.insert("Student", null, cv); 2. 查詢時,把欲查出的欄位名稱存於字串陣列裡,再把它傳給 db.query()函數即 可。如下: String col[] = {"stud_no", "stud_name" }; cur = db.query("Student", col, null, null, null, null, null); Integer n = cur.getCount(); 查詢之後,db.query()回傳資料庫游標(Cursor)值給 cur,然後 cur.getCount()就 傳回所查到的資料筆數。 3. 指令: if( !cur.isAfterLast() ){ String ss = cur.getString(0) + ", " + cur.getString(1); // ……. cur.moveToNext(); } 由 cur.isAfterLast()判斷目前是否已經超出最後一筆資料了。如果不是,就藉由 cur.getString(0)取得第 1 個欄位的資料;而 cur.getString(0)取得第 2 個欄位的資 料值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值