Android SQLite數據庫存儲
前言:
Android為了讓我們更加方便的管理數據庫,專門提供了SQLiteOpenHelper幫助類,借助這個類可以簡單的對數據庫進行創建和升級。
下面介紹一下SQLiteOpenHelper:(擴展知識)
SQLiteOpenHelper類介紹
- 定義:SQLiteOpenHelper是一個輔助類
- 作用:管理數據庫(創建、增、修、刪) & 版本的控制。
- 使用過程:通過創建子類繼承SQLiteOpenHelper類,實現它的一些方法來對數據庫進行操作。 在實際開發中,為了能夠更好的管理和維護數據庫,我們會封裝一個繼承自SQLiteOpenHelper類的數據庫操作類,然后以這個類為基礎,再封裝我們的業務邏輯方法。
- SQLiteOpenHelper類的數據庫操作方法介紹
方法名 作用 備注 onCreate() 創建數據庫 創建數據庫時自動調用 onUpgrade() 升級數據庫 close() 關閉所有打開的數據庫對象 execSQL() 可進行增刪改操作, 不能進行查詢操作 query()、rawQuery() 查詢數據庫 insert() 插入數據 delete() 刪除數據 getWritableDatabase() 創建或打開可以讀/寫的數據庫 通過返回的SQLiteDatabase對象對數據庫進行操作 getReadableDatabase() 創建或打開可讀的數據庫 同上
簡單總結上面的:
我們知道:
SQLiteOpenHelper 是一個抽象類,abstract class.
擁有成員變量,mName(數據庫名稱),mNewVersion(數據庫版本),mDatabase(數據庫)等.
構造函數需要傳遞,context,數據庫名稱,數據庫版本等信息.
SQLiteOpenHelper(Context context, String name, CursorFactory factory,int version)
實現了以下函數:
getDatabaseName
getWritableDatabase
getReadableDatabase
onDowngrade
close
subclass需要實現以下函數:
public abstract void onCreate(SQLiteDatabase db);
public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion);
? 它是一個抽象類,意味著我們要使用它就需要創建一個自己的類去繼承它,兩個抽象方法:onCreate()和onUpgrade(),需要重寫,實現創建、升級數據庫的邏輯。
實例方法:getReadableDatabase()和getWritableDatabase(),如果存在打開,不存在時創建,當磁盤滿了,上一個以只讀方式打開,writable出現異常。
構造方法:參數:Context,daba_name,Cursor,version
存在位置:/data/data//databases/目錄下。
1.創建數據庫
我們用AS創建一個DatabaseTest項目,先來熟悉建表的相關語句:
建表語句:
create table Book{
id integer primary key autoincrement,//組件,id列自增長
author text,//文本類型
price real,//浮點型
pages integer,//整型
name text)
}
新建MyDatabaseHelper類繼承SQLiteOpenHelper
public class MyDatabaseHelper extends SQLitePenHelper{
pulic static final String CREATE_BOOK = "create table Book("
+"id integer primary key autonincreament,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)";
private ContextmContext;
public MyDatabaseHelper(Context context,String name,SQLiteDatabase.
CursorFactory factory,int version){
super(context,name,factory,version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT)
.show();
}
@Override
public void onUpagrade(SQLiteDatabase db,int oldVersion, int newVersion)
){}
}
用Android Studio創建過程:
首先activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create database"
/>
</LinearLayout>
修改MainActivity
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
查看:
可以使用命令行來查看信息,翻到文末的資料小卡片了解更多->>>
/data/data/com.example.databasetest/databases/
使用ls查看
兩個文件,一個BookStore.db,借助sqlite3+數據庫名
查看表:.table
.schema查看建表語句
.exit退出
2.升級數據庫
如果想添加一張Catagory表用于記錄圖書的分類
首先:建表語句如下:
create table Category (
id integer primary key autoincrement,
category_name text,
category_code integer)
添加到MyDatabaseHelper中
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
版本升級變為2
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
建表完成之后接下來就是基本操作CRUD(Create,Retrieve,Updata,Delete)
3.添加數據
我們在調用SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法,返回了SQLitaDatabase對象,所以我們借助這個對象進行操作。
操作的方法:
? insert()方法(表名,null, ContenValues對象:提供put()方法重載以此添加數據)
建立UI
<Button
android:id="@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add data"
/>
點擊事件添加邏輯
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 開始組裝第一條數據
values.put("name", "The Da Vinci Code");
values.put("author", "Dan Brown");
values.put("pages", 454);
values.put("price", 16.96);
db.insert("Book", null, values); // 插入第一條數據
values.clear();
// 開始組裝第二條數據
values.put("name", "The Lost Symbol");
values.put("author", "Dan Brown");
values.put("pages", 510);
values.put("price", 19.95);
db.insert("Book", null, values); // 插入第二條數據
}
});
4.更新數據
? update()方法(表名,ContenValues對象,第三,第四約束更新的數據,不指定就是默認更新所有行)
UI
<Button
android:id="@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Update data"
/>
邏輯
Button updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name = ?", new String[] { "The Da Vinci
Code" });
}
});
5.刪除數據
? delete()方法(表名,第二第三約束刪除某一行或某幾行)
UI
<Button
android:id="@+id/delete_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Delete data"
/>
邏輯
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book", "pages > ?", new String[] { "500" });
}
});
6.查詢數據
query()方法(表名,指定查詢那幾列,第三第四約束查詢某一行或者某幾行,第五指定需要取group by的列,不指定則表示不操作,第六對group by進一步的操作,第七指定查詢結果的排序方式)
UI
<Button
android:id="@+id/query_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Query data"
/>
邏輯
Button queryButton = (Button) findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 查詢 Book 表中所有的數據
Cursor cursor = db.query("Book", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
// 遍歷 Cursor 對象,取出數據并打印
String name = cursor.getString(cursor.getColumnIndex
("name"));
String author = cursor.getString(cursor.getColumnIndex
("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex
("price"));
Log.d("MainActivity", "book name is " + name);
Log.d("MainActivity", "book author is " + author);
Log.d("MainActivity", "book pages is " + pages);
Log.d("MainActivity", "book price is " + price);
} while (cursor.moveToNext());
}
cursor.close();
}
});
7.展示圖片:
8.當然也可以使用SQL或者LitePal操作數據庫
例如使用SQL
? 添加數據的方法如下:
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" });
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" });
? 更新數據的方法如下:
db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99",
"The Da Vinci Code" });
? 刪除數據的方法如下:
db.execSQL("delete from Book where pages > ?", new String[] { "500" });
? 查詢數據的方法如下:
db.rawQuery("select * from Book", null);
資料:
在命令行操作使用SQL語句操作SQLite數據庫
1)adb shell 進入
2)在終端輸入“sqlite3”進入命令行操作界面
sqlite>
sqlite>
…
3)常用的sqlite3命令
.help
.exit/.quit 退出
ctrl+L//清屏
2 常用SQL語句
2.1 創建數據庫
語法:
sqlite3 testDB.db
創建名字為testDB.db數據庫文件,然后進入sqlite命令行界面
sqlite> .databases //查看當前操作數據庫的信息
2.2 創建表(Table)
語法:
CREATE TABLE table_name(
column1 datatype [PRIMARY KEY],
column2 datatype ,
…);
注:不區分大小寫,習慣關鍵字用大寫
PRIMARY KEY:主鍵,表示該類數據不能重復,可以加快數據庫的訪問,一張表中只有一列可以聲明為主鍵。
eg:創建company表:ID、姓名、年齡、地址、薪資
sqlite> CREATE TABLE company(
…> id INT PRIMARY KEY,
…> name TEXT,
…> age INT,
…> address TEXT,
…> salary REAL NOT NULL);
.tables :查看當前數據庫中存在數據表
.schema:查看數據表的完整信息
2.3刪除表
語法:
DROP TABLE table_name;
2.4向數據表中插入數據
語法:
INSERT INTO table_name
(column1,column2,column3,…)
VALUES(value1,value2,value3,…)
eg:
sqlite> INSERT INTO company
…> (id,name,salary)
…> VALUES(10086,“張飛”,12000);
sqlite> SELECT * FROM company; //查詢表中全部數據
2.5從數據表刪除一條數據
語法:
DELETE FROM table_name WHERE [condition];
參考資料:《第一行代碼》《Android權威編程指南》
智能推薦
android 數據庫存儲之GreenDao的使用
1.GreenDao介紹 在項目開發過程中,涉及到存儲,一般都用都SQlite,GreenDao是新出現的數據庫,是一個對象關系映射(ORM)的框架,能夠提供一個接口通過操作對象的方式去操作關系型數據庫,它能夠讓你操作數據庫時更簡單、更方便 如圖所示: 2.GreenDao的優勢 1.性能高,號稱Android最快的關系型數據庫 2.內存占用小 3.庫文件比較小,小于100K,編譯時間低,而且可以...
【Android】數據存儲-SQLite
SQLite特點: 輕量級 獨立 隔離 跨平臺 多語言接口 安全性(多進程可以同時讀取,但同一時間只能有一個進程在寫入數據) 創建數據庫和表,以及數據庫的增刪改查操作 DatabaseHelper.java 創建一個activity: DatabaseButtonActivity.java xml: 使用Android Debug Database查看數據庫和表信息 參考鏈接:https://ju...
Android數據存儲(二)---Sqlite數據庫(下)
sqlite事務的使用: SQLite 事務(Transaction) 事務(Transaction)是一個對數據庫執行工作單元。事務(Transaction)是以邏輯順序完成的工作單位或序列,可以是由用戶手動操作完成,也可以是由某種數據庫程序自動完成。事務(Transaction)是指一個或多個更改數據庫的擴展。例如,如果您正在創建一個記錄或者更新一個記錄或者從表中刪除一個記錄,那么您正在該表上...
Android數據存儲(二)---Sqlite數據庫(上)
對于更加復雜的數據結構, Android提供了內置的SQLite數據庫來存儲數據,SQLite使用SQL命令提供了完整的關系型數據庫能力,每個使用SQLite的應用程序都有一個該數據庫的實例,并且在默認情況下公限當前應用使用,數據庫存存儲在android設置 的/data/data/包名/databases文件夾中. 如圖: 什么是...
【SQLite數據庫存儲】CRUD操作
CRUD C 代表添加 (Create) R代表查詢(Retrieve) U代表更新(Update) D代表刪除(Delete) 每一種操 作又各自對應了一種 SQL命令,如果你比較熟悉 SQL語言的話,一定會知道添加數據時使 用 insert,查詢數據時使用 select,更新數據時使用 update,刪除數據時使用 delete 但是開 發者的水平總會是參差不齊的,未必每一個人都能非常熟悉地使...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...