SQLite
一.簡意:
(1)SQLite:是一款輕量級關係數據庫,佔用資源少,運行速度快
(2)適用於大量複雜關係數據(file,sp此時不太適合)
二,用法:
(1)創建一個類 繼承SQLiteOpenHelper,重寫onCreate()和onUpgrade()方法
onCreate()方法:創建表
onUpgrade():版本更新
如下:
public class MyDatabaseHelper extends SQLiteOpenHelper {
private Context mContext;
//創表語句
public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+"name text)";
//創表語句2
public static final String CREATE_CATEGORY = "create table Category ("
+ "id integer primary key autoincrement, "
+ "category_name text, "
+ "category_code integer)";
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
/**
* 創建表
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext , "Create successed" , Toast.LENGTH_SHORT).show();
}
/**
* 更新數據表
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
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);
}
}
佈局,定義簡單的幾個按鈕:
<?xml version="1.0" encoding="utf-8"?>
<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"/>
<Button
android:id="@+id/add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="add data"/>
<Button
android:id="@+id/delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="delete data"/>
<Button
android:id="@+id/update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="update data"/>
<Button
android:id="@+id/retrieve"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="retrieve data"/>
</LinearLayout>
在Activity中去執行操作,
四個方法的運用說明在例子中
public class DataBaseActivity extends AppCompatActivity {
//創建數據庫
@ViewInject(R.id.create_database)
private Button mBtnCreate;
//增加數據
@ViewInject(R.id.add)
private Button mBtnAdd;
//更新數據
@ViewInject(R.id.update)
private Button mBtnUpdate;
//刪除數據
@ViewInject(R.id.delete)
private Button mBtnDelete;
//查詢數據
@ViewInject(R.id.retrieve)
private Button mBtnRetrieve;
//MyDatabaseHelper對象
private MyDatabaseHelper dbHelper;
//SQLiteDatabase對象
private SQLiteDatabase db;
private static final String TAG = "DataBaseActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_database);
ViewUtils.inject(this);
//初始化:4個參數:上下文,數據庫名字,CursorFactory對象,版本號;
//當需要更新數據庫版本時可以+1
dbHelper = new MyDatabaseHelper(this , "BookStore.db" , null ,1);
db = dbHelper.getWritableDatabase();
}
/**
* 創建數據庫表
* @param view
*/
@OnClick(R.id.create_database)
public void CreateDatabase(View view){
//創建或打開一個現有的數據庫
//getReadableDatabase():當磁盤空間滿時,將以只讀方式去打開
//getWritableDatabase():當磁盤已滿時,拋出異常
dbHelper.getWritableDatabase();
}
/**
* 增加數據:public long insert(String table, String nullColumnHack, ContentValues values)
* table:表名
* nullColunmHack:用於在未指定添加數據時,給某些空列自動賦值null
* values:ContentValues對象,添加相應數據
* @param view
*/
@OnClick(R.id.add)
public void addDate(View view){
ContentValues values = new ContentValues();
//
values.put("name" , "第一行代碼");
values.put("author" , "郭霖");
values.put("pages" , 570);
values.put("price" , 79.00);
db.insert("Book" , null , values);
values.clear();
//
values.put("name" , "編譯原理");
values.put("author" ,"MouMou");
values.put("pages" , 500);
values.put("price" , 66.00);
db.insert("Book" , null , values);
}
/**
* 更新數據:4個參數
* 假如突然打折,更新某個商品價格
* public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
* whereClause:約束某些行
* whereArgs:約束某些行的更新數據
* @param view
*/
@OnClick(R.id.update)
public void updateData(View view){
ContentValues values = new ContentValues();
values.put("price" , 58.99);
db.update("Book" , values , "name = ?",new String[]{"編譯原理"});
}
/**
* 刪除數據:4個參數
* public int delete(String table, String whereClause, String[] whereArgs)
* 與update類似
* @param view
*/
@OnClick(R.id.delete)
public void deleteData(View view){
db.delete("Book" , "price < ?" ,new String[]{"60"});
}
/**
* 查詢數據:7個參數
* public Cursor query(String table, String[] columns, String selection,
* String[] selectionArgs, String groupBy, String having,
* String orderBy)
* table--查詢的表名,columns--指定要查詢的列名(select column1,column2...)
* selection ---- 指定where的約束條件(where column = value)
* selectionArgs---爲where中的佔位符提供具體值
* groupBy --- 指定需要group by 的列(group by column)
* having -- 對group by後的結果進行約束(having column = value)
* orderBy 指定查詢結果的排序方式(order by column1,column2,,,)
* @param view
*/
@OnClick(R.id.retrieve)
public void retrieveData(View view){
Cursor cursor = db.query("Book" , null ,null, null ,null , null ,null);
if(cursor.moveToFirst()){
do{
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(TAG , "book name is " + name);
Log.d(TAG , "book author is " + author);
Log.d(TAG , "book pages is " + pages);
Log.d(TAG , "book price is " + price);
}while (cursor.moveToNext());
}//if
cursor.close();
}
}
記得自己去看SQLiteDatabase和SQLiteOpenHelper的源碼略....
LitePal:
這是github上的開源庫,穩定性強,操作簡單,效率高等等
運用:
(1)在build.gradle(app)添加依賴:
compile 'org.litepal.android:core:1.5.1'
(2)在app/src/main下新建一個路徑命名:assets,然後在該目錄下創建xml文件litepal.xml
內容如下:
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<!--數據庫名字.db-->
<dbname value = "BookStore"/>
<!--數據庫版本,更新時改動版本-->
<version value = "1"/>
<!--這是自己新建的用於數據庫存放表數據類型-->
<list>
<mapping class = "testsdcard.cai.maiyu.mdaima06_01.bean.Book"/>
</list>
</litepal>
無疑是指定數據庫名字,版本,還有一個後面你自己創建的數據表類型(可以先不添加)
(3)在manifest中去配置:
在<application
android:name="org.litepal.LitePalApplication"
.....
>
......
</application>
若是用自己的application也一樣,記得在自己定義的application的onCreate方法中初始化:LitePal 。初始化(this);
(4)創建數據表類:繼承DataSupport
public class Book extends DataSupport{
private int id; //id
private String name; //書名
private String author; //作者
private int pages; //頁數
private double price; //價格
// private String press; //出版社
// public String getPress() {
// return press;
// }
//
// public void setPress(String press) {
// this.press = press;
// }
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
(5)Activity中使用:
public class TestLitePalActivity extends AppCompatActivity {
//創建數據庫
@ViewInject(R.id.create_database)
private Button mBtnCreate;
//增加數據
@ViewInject(R.id.add)
private Button mBtnAdd;
//更新數據
@ViewInject(R.id.update)
private Button mBtnUpdate;
//刪除數據
@ViewInject(R.id.delete)
private Button mBtnDelete;
//查詢數據
@ViewInject(R.id.retrieve)
private Button mBtnRetrieve;
private static final String TAG = "TestLitePalActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_database);
ViewUtils.inject(this);
}
//創建數據庫
@OnClick(R.id.create_database)
public void createDatabase(View view){
//獲取數據庫
LitePal.getDatabase();
}
/**
* 添加數據
* @param view
*/
@OnClick(R.id.add)
public void addData(View view){
Book book = new Book();
book.setName("大話數據結構");
book.setAuthor("程傑");
book.setPages(516);
book.setPrice(43.00);
//book.setPress("Unknow");//增加出版社
book.save();
}
/**
* 刪除數據
* @param view
*/
@OnClick(R.id.delete)
public void deleteData(View view){
DataSupport.deleteAll(Book.class , "price < ?" , "60");
}
/**
* 更新數據
* @param view
*/
@OnClick(R.id.update)
public void updateData(View view){
Book book = new Book();
book.setPrice(38.50);
book.updateAll("name = ? and author = ?" , "大話數據結構" , "程傑");
//更新數據爲默認值
// book.setToDefault("pages");
// book.updateAll();
}
/**
* 查詢數據
* @param view
*/
@OnClick(R.id.retrieve)
public void retrieveData(View view){
List<Book> books = DataSupport.findAll(Book.class);
for(Book book : books){
Log.d(TAG , "book name is " + book.getName());
Log.d(TAG , "book author is " + book.getAuthor());
Log.d(TAG , "book pages is " + book.getPages());
Log.d(TAG , "book price is " + book.getPrice());
}
//(2)添加限制:select--選定哪幾列
//where--約束條件, order--結果排序 ,limit---結果的數量
//offset---查詢結果的便宜了offset(1)代表查詢表中的從第2條開始
// List<Book> books = DataSupport.select("name" , "author" ,"pages")
// .where("pages > ?" , "600")
// .order("pages")
// .limit(10)
// .offset(10)
// .find(Book.class);
//(3)用原生數據庫語句查詢
// Cursor cursor = DataSupport.findBySQL("select * from Book where pages > ?" +
// " and price < ?" ,"700" ,"60");
}
}
從代碼中,對比SQLite,發現更簡單,更方便,是不是呢?
(1)創建,更新,刪除,增加,是不是更方便呢,
(2)而版本更新,只需要在litepal.xml中改版本號
(3)查詢,之前要7個參數,現在利用DataSupport.findXXX就可以了
(4)記得創建數據表類要繼承DataSupport類
(5)查詢還支持多種查詢,原生SQL語句查詢,
。。。最後去看一下源碼