顯示具有 SQLite 標籤的文章。 顯示所有文章
顯示具有 SQLite 標籤的文章。 顯示所有文章

2018年1月7日 星期日

Android-SQLite 使用 SQLiteOpenHelper (六)_查詢資料( Select )

此篇說明如何查詢對應的結果

1 . 全部結果查詢
private static final String TABLE_CONTACTS = "counter";
private static final String KEY_DATE = "count_date";
private static final String KEY_NUMBER = "count_number";
private static final String KEY_NOTE = "count_note";

/**
 * 取得所有資料
 *
 * @return
 */
public List<Map<String, Object>> getAllData() {
    
    List<Map<String, Object>> listData = new ArrayList<Map<String, Object>>();
    // 查詢條件
    String strSelect = "SELECT  * FROM " + TABLE_CONTACTS;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(strSelect, null);
    if (cursor.moveToFirst()) {
        do {
            Map<String, Object> mapData = new HashMap<String, Object>();
            mapData.put(KEY_ID, cursor.getString(0));
            mapData.put(KEY_DATE, cursor.getString(1));
            mapData.put(KEY_NUMBER, cursor.getString(2));
            mapData.put(KEY_NOTE, cursor.getString(3));
            listData.add(mapData);
        } while (cursor.moveToNext());
    }

    return listData;
}

2 . 查詢條件結果
private static final String TABLE_CONTACTS = "counter";
private static final String KEY_DATE = "count_date";
private static final String KEY_NUMBER = "count_number";
private static final String KEY_NOTE = "count_note";

/**
 * 取得當日資料
 *
 * @return
 */
public Map<String, Object> getCurrentData(@NonNull Date mDate) {

    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Map<String, Object> mapData = new HashMap<String, Object>();
    // 查詢條件
    String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS + " WHERE " + KEY_DATE + " = ? ";
    String[] strVal = new String[]{sdf.format(mDate)};
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, strVal);
    if (cursor.moveToFirst()) {
        do {
            mapData.put(KEY_ID, cursor.getString(0));
            mapData.put(KEY_DATE, cursor.getString(1));
            mapData.put(KEY_NUMBER, cursor.getString(2));
            mapData.put(KEY_NOTE, cursor.getString(3));
        } while (cursor.moveToNext());
    }

    return mapData;
}


查詢結果出來的容器 Cursor 是什麼?我要怎麼藉由此東西取出我要的值?
官方說明為









還是不懂怎辦?
可以把它想成是一種 Map
取出來的順序必須依照欄位的順序
不然會取不到對應的值

參考資料:時間區間格式

歡迎轉載,請註明出處。




Android-SQLite 使用 SQLiteOpenHelper (五)_刪除資料( Delete )

上一篇有提到修改資料

此篇則是說明如何刪除對應資料
使用此功能必須要非常謹慎
所以要再次確認此功能是否是您所想要的

1 . 刪除資料
private static final String TABLE_CONTACTS = "counter";
private static final String KEY_DATE = "count_date";
private static final String KEY_NUMBER = "count_number";
private static final String KEY_NOTE = "count_note";
/**
 * 刪除資料列
 */
public int deleteData(@NonNull Date mData) {

    // DELETE FROM Table where 條件....
    String deleteVal = KEY_DATE + " = ?";
    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String[] strVal = new String[]{sdf.format(mData)};

    // 如果你有多條件
    /*
    String strSQL = KEY_DATE + " = ? AND " + KEY_NOTE + " = ?";
    // 第一問號,第二問號...以此類推
    String[] strings = new String[]{sdf.format(mDate), "Apple"};
    */

    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete(TABLE_CONTACTS, deleteVal, strVal);
} 

為什麼 strSQL 不用放完整字組?為什麼條件參數要提出來?
要解這些問題前就必須追程式碼了













原來內部方法已經將刪除指令寫在內部
所以我們只要編寫 Where 後的指令
那為什麼要用 String 裝條件的變數?
也是因為上圖最後幾行所提出來的
依照集合內的參數依序擺放

其實擺放參數有以下此方法 :
1 . 用集合方法( 如上方 )
2 . 只接將參數寫在條件內
private static final String TABLE_CONTACTS = "counter";
private static final String KEY_DATE = "count_date";
private static final String KEY_NUMBER = "count_number";
private static final String KEY_NOTE = "count_note";
. 
.
.
public int deleteData(@NonNull Date mDate, int number, String note) {
   
    String strSQL = KEY_DATE + " = '2018-01-05'";

    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete(TABLE_CONTACTS, strSQL, null);
}

歡迎轉載,請註明出處。

Android-SQLite 使用 SQLiteOpenHelper (四)_修改資料( Update )

上一篇我們提到新增資料

此篇我們要提到的是修改資料

1 . 修改資料
private static final String TABLE_CONTACTS = "counter";
private static final String KEY_DATE = "count_date";
private static final String KEY_NUMBER = "count_number";
private static final String KEY_NOTE = "count_note";
/**
 * 更新資料
 *
 * @param mDate
 * @param number
 * @param note
 */
public int updateData(@NonNull Date mDate, int number, String note) {
    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    ContentValues values = new ContentValues();
    values.put(KEY_NUMBER, number);
    values.put(KEY_NOTE, note);

    String strSQL = KEY_DATE + " = ?";
    String[] strings = new String[]{sdf.format(mDate)};

    // 如果你有多條件
    /*
    String strSQL = KEY_DATE + " = ? AND " + KEY_NOTE + " = ?";
    // 第一問號,第二問號...以此類推
    String[] strings = new String[]{sdf.format(mDate), "Apple"};
    */

    SQLiteDatabase db = this.getWritableDatabase();
    return db.update(TABLE_CONTACTS, values, strSQL, strings);
}

為什麼 strSQL 不用放完整字組?為什麼條件參數要提出來?
要解這些問題前就必須追程式碼了











原來內部方法已經將修改指令寫在內部
所以我們只要編寫 Where 後的指令
那為什麼要用 String 裝條件的變數?
也是因為上圖最後幾行所提出來的
依照集合內的參數依序擺放

其實擺放參數有以下此方法 :
1 . 用集合方法( 如上方 )
2 . 只接將參數寫在條件內
private static final String TABLE_CONTACTS = "counter";
private static final String KEY_DATE = "count_date";
private static final String KEY_NUMBER = "count_number";
private static final String KEY_NOTE = "count_note";
. 
.
.
public int updateData(@NonNull Date mDate, int number, String note) {
   
    String strSQL = KEY_DATE + " = '2018-01-05'";

    SQLiteDatabase db = this.getWritableDatabase();
    return db.update(TABLE_CONTACTS, values, strSQL, null);
}


參考資料:SQLiteBrowser
歡迎轉載,請註明出處。

2018年1月6日 星期六

Android-SQLite 使用 SQLiteOpenHelper (三)_新增資料( Insert )

上一篇有談到如何建立簡單的資料表(Table)
此篇我們要來談
如何創立簡單的新增、修改、刪除、查詢方法
以便於我們後續使用

1 . 新增資料
private static final String KEY_DATE = "count_date";
private static final String KEY_NUMBER = "count_number";
private static final String KEY_NOTE = "count_note";  

/**
 * 添加單筆資料
 *
 * @param mDate
 * @param number
 * @param note
 * @return
 */
public boolean addData(@NonNull Date mDate, int number,
                       String note) {

    ContentValues values = new ContentValues();
    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    values.put(KEY_DATE, sdf.format(mDate));
    values.put(KEY_NUMBER, number);
    values.put(KEY_NOTE, note);

    // Inserting Row
    SQLiteDatabase db = this.getWritableDatabase();
    return db.insert(TABLE_CONTACTS, null, values) == -1 ? false : true;
}

為什麼 insert 方法欄位有一個 null ?? 這欄位的用途是啥?












nullColumnHack :
簡單來說,SQLite 無法像 SQL 直接放置空值
所以必須給一個欄位名稱讓他產生充滿 null 的一列
還是不了解?那我們來實作一番

這是原本的 Table






我們執行指令後









再次執行指令












如果我們有需要用到此方法
最後一欄一定要 null
public void ...(){
  db.insert(TableName, ColumnName, null);  
}


2018年1月5日 星期五

Android-SQLite 使用 SQLiteOpenHelper (二)_說明

更新日期:20180105

上一篇我們有先規劃我們想要產出的表格
那此篇就開始 簡易教學吧

1 . 首先,繼承 SQLiteOpenHelper
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDatabaseHandler extends SQLiteOpenHelper {
    // 必要
    public MyDatabaseHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 如果資料庫不存在
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       // 資料庫有任何參數異動
    }
}


2 . SQLiteOpenHelper 須提供的參數









name : DataBase 的名稱。
factory : 若無使用到指標,則預設為 null。
version : 如果版號與先前不同,則會觸發 onUpgrade。

3 . 將上一篇我們所需要的參數提出,並將建構子更改成我們需要的
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "counterManager";

public MyDatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

4 . 建立我們所需要的 資料表( Table )
備註: Table如果需多個 Table 也在此建立
private static final String TABLE_CONTACTS = "counter";
private static final String KEY_ID = "id";
private static final String KEY_DATE = "count_date";
private static final String KEY_NUMBER = "count_number";
private static final String KEY_NOTE = "count_note";

@Override
public void onCreate(SQLiteDatabase db) {
    // 依照各自需求建立對應的資料表
    // 建立資料庫
    String createDB = "create table " + TABLE_CONTACTS + "(" +
            KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
            KEY_DATE + " DATE UNIQUE NOT NULL," +
            KEY_NUMBER + " int," +
            KEY_NOTE + " char(255)" +
            ");";
    db.execSQL(createDB);
}

5 . 處理版本升級問題
private static final String TABLE_CONTACTS = "counter";

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // 如果資料庫有更新,則移除存在的
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
    onCreate(db);
}


先記錄問題
1 . onUpgrade 觸發的實際時機



2016年5月12日 星期四

Android-SQLite 使用(一)

趁最近有機會
可以有接觸 SQLite
就把小簡易程式碼放此
並且實案教學

1 . 為什麼要用 DB 存取
2 . 有需要存哪些資料
3 . 要有啥功能
....等,如有需要補充
請至下方留言

簡易專案:
名稱:筆記本
用途:使用者紀錄每天備忘錄

1 . 建立資料庫
create table counter (
  id INTEGER PRIMARY KEY   AUTOINCREMENT,
  count_date TimeStamp UNIQUE  NOT NULL,
  count_number int,
  count_note char(255)
);

2 . 新增資料
insert into counter (count_date, count_number, count_note) 
      values (Date(), 20, "1_1");

3 . 修改資料
update counter set count_number = 40, count_note = "1_2"
      where count_date = Date();

4 . 刪除資料
delete from counter where count_date = Date();

5 . 查詢資料
select * from counter;
select * from counter order by count_date ASC;  小到大
select * from counter order by count_date DESC; 大到小
select count_number from counter where count_date = "2017-12-30";


參考資料 : Android高效入門—SQLite資料庫
參考資料:How to store data locally in an Android app
參考資料:How do I view the SQLite database on an Android device? [duplicate]

2016年3月7日 星期一

MySQL SQLite-How use "UPDATE" in the sql?

上一篇 : MySQL SQLite-How use "DELETE" in the sql?

繼上一篇刪除功能
接下來
那我用新增資料再刪除舊的資料太麻煩了
那還有其他的方法嗎??
有的
那就是更新
可是在更新前一定要先搜尋會被更改到的資料
不然後續會很麻煩的

----------------------------------------------------
更新語法

1 . 條件欄位取代
更新資料表名稱設定參數( 新 )條件參數(舊)
UPDATEtable_nameSETa = 7WHEREa = 6

UPDATE COMPANY SET AGE = 25, NAME = ..... WHERE NAME = 'Allen' ;































2 . 此欄位全部被取代
更新資料表名稱設定參數( 新 )
UPDATEtable_nameSETa = 7
此方法要謹慎使用


UPDATE COMPANY SET AGE = 30;














































歡迎轉載,請註明出處。

2016年3月6日 星期日

MySQL SQLite-How use "DELETE" in the sql?

上一篇 : MySQL SQLite-How use "SELECT" in the sql?

既然可以新增資料
但如果我有不要的資料要如何做處裡
當然可以
但是!!!
資料量少當然沒問題,只需要抓 Key
但是  !!!
資料量如果是上千筆
一定要先用 SELECT 在加上你要 DELETE 的 Key
不然那可能神仙也難救了...

--------------------------------------------------------------------------
刪除語法
刪除欄位 ( 不用填值 )來源資料表名稱判斷條件
DELETEFROMtable_nameWHEREa = 6
其實,刪除的語法跟 SELECT 的語法類似
前面的動作和欄位不用填寫。

DELETE FROM COMPANY WHERE ID = 4;















































建議用法( 以上執行指令為例 )
1 . 先將要刪除的條件用 SELECT 列出來,確認有無其餘資料。
SELECT * FROM COMPANY WHERE ID = 4;

2 . 再執行剛剛的刪除步驟。
DELETE FROM COMPANY WHERE ID = 4;

歡迎轉載,請註明出處。

2016年2月28日 星期日

MySQL SQLite-How use "SELECT" in the sql?

上一篇 : How insert into data in table?

上一篇簡單介紹有關如何將資料寫入
接下來就準備從上百筆、上千筆的資料表取資料囉

使用的方法我們慢慢的簡介

1 . 顯示所有的資料欄
SELECT * 
FROM table_name;
















2 . 顯示特定的資料欄
SELECT column1,column2... 
FROM table_name;
















3 . 顯示特定的資料欄,並且加入篩選的條件( 以下簡略集中說明 )
SELECT column1,column2... 
FROM table_name
// 等於
WHERE column1 = 3;
// 大於
WHERE column1 > 3;
// 等於_文字
WHERE column1 = 'A';
// 欄位等於 NULL
WHERE column1 = 'NULL';
// IS NULL 要全大寫
WHERE column1 IS NULL;
















4 . 篩選過濾文字(  % 、 _  )
SELECT column1,column2... 
FROM table_name
// 篩選目標字尾為 CS : SDVCS、YEKCS、51584CS
WHERE column1 LIKE '%CS';
// 篩選目標字尾為 CS 附帶前一字元 : ACS、UCS
WHERE column1 LIKE '_CS';






















5 . 多筆條件 ( OR 、 AND )
SELECT column1,column2... 
FROM table_name
// 及
WHERE column2 = 3 AND column3 < 5;
// 或 
WHERE column2 = 3 OR column3 < 5;























6 . 同欄位範圍值( BETWEEN )
SELECT column1,column2... 
FROM table_name
// 3 ~ 10
WHERE column2 BETWEEN 3 AND 10;
// B ~ H
WHERE column2 BETWEEN 'B' AND 'H';
// 10 ~ 3 順序不對
WHERE column2 BETWEEN 10 AND 3;
EX : 3 ~ 10、B ~ H

7 . 同欄位特定值( IN )
SELECT column1,column2... 
FROM table_name
// 欄位包含
WHERE column2 IN('Tom', "Peter", "May");
// 反之,欄位不可包含
WHERE column2 NOT IN('Tom', "Peter", "May");

8 . 不可、反
SELECT column1,column2... 
FROM table_name
WHERE NOT column1 = 3;
類似 Java 的 " ! "

歡迎轉載,請註明出處


MySQL SQLite-How insert into data in table?

上一篇 : Create Table in the DataBase

之前我們有提到如何創立資料表
那我們依照語法生成資料表後
我們要如何將資料置入到資料表內?

有三種方法 :
1 . 將參數放置對應欄位
INSERT INTO table_name(column1, column2...)
VALUES(value1, value2...);

2 . 依照欄位順序放置參數
INSERT INTO table_name
VALUES(value1, value2...);

3 . 指定欄位放置參數,有可能直接跳過不設置
INSERT INTO table_name(column3, column5...)
VALUES(value3, value5...);


以下是範例程式 :
CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
)

Insert into :
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
































參考資料 : SQLite - INSERT Query

歡迎轉載,請註明出處。

2016年2月27日 星期六

MySQL SQLite-Create Table in the DataBase

我們在前一篇 : What's Column、Row、Table、DataBase?

我們如何使用語法新建資料表?
會很複雜嗎?

就目前最複雜的是 :
你的需求是甚麼?你有哪些資料要放!!!
你的需求是甚麼?你有哪些資料要放!!!
你的需求是甚麼?你有哪些資料要放!!!

以上的問題思考分析完就可以將內容放置進去
CREATE TABLE table_name(
    欄位名稱_1 型別_1,
    欄位名稱_2 型別_2
    .
    .
    .
);

那資料欄的內容要怎麼設定?
CREATE TABLE products1(
    name VARCHAR(10),
    type INT NOT NULL,
    cost DEC(3, 2) NOT NULL DEFAULT 1.0
);

我們用表格來說明

欄位名稱欄位型別是否能為空值初始定義初始定義參數
nameVARCHAR(10)
typeINTNOT NULL
costDEC(3, 2)NOT NULLDEFAULT1.0

欄位要用 : "," 分隔。
















接下來,我們針對欄位型別做簡單的說明

型別範例
CHAR(5)'Tom'
VARCHAR(5)'Tom'
INT123
DEC(6,2)1234,56
DATE27/02/2016
DATETIME

CHAR(5) vs VARCHAR(5) 差異?

型別CHAR(5)VARCHAR(5)
內容TomTom
長度(length)53

如果每筆資料量遠小於預設字元
使用 CHAR 就會造成空間的浪費



歡迎轉載,請註明出處。

2016年2月26日 星期五

MySQL SQLite-What's Column、Row、Table、DataBase?

相信大家對以上名詞再熟悉不過了
如果還是不太了解
此篇以最簡單的圖解來解釋以上的名詞

1 .  Column 欄位 資料欄









2 . Row 列 資料列









3 . Table 表格 資料表




















4 . DataBase 資料庫



















歡迎轉載,請註明出處。

2016年2月22日 星期一

SQLite-新增、修改、刪除 SELECT, INSERT, DELETE, UPDATE,WHERE

上一篇 :

上一篇有簡單介紹如何建立資料
接下來我們要來介紹
用語法執行 : 篩選( Select )、新增( Insert )、修改( Update )、刪除( Delete )

篩選
// 所有欄位
SELECT * FROM products;

// Name 和 Price 欄位
SELECT Name,Price FROM products;


2016年2月20日 星期六

SQLite-創立表格 Create Table (UI

上一篇 : SQLite-創立資料庫 Create DataBase

創立完資料庫後
我們就要開始建立表格
1 . 創立表格

















2 . 設立欄位型態

















3 . 可以複製他生成的語法或者直接幫你創立

















4 . 檢查您剛剛生成的表格及欄位

















5 . 請先新增幾筆資料以便於後續流程















6 . 參考圖樣















歡迎轉載,請註明出處。

SQLite-創立資料庫 Create DataBase

前一章 : 

有了應用程式和工具
接下來開始創立新的資料庫
首先開啟 FireFox 附加工具

畫面


















1 . 創立新的 DataBase

















2 . DataBase 名稱

















3 . 儲存位置 

4 . 確認是否創立成功


















歡迎轉載,請註明出處。

SQLite-下載 安裝 工具

SQLite 是一個小型的資料庫
非常適合用於行動裝置上
接下來我們要簡單介紹怎麼在 Window 中執行
最後我們使用 FireFox 提供的應用程式編輯

1 . 到官方下載應用程式SQLite Download





























2 . 將檔案解壓縮完,並且放置( sqlite3.ext )到好管理的位置





















3 . 開啟 FireFox 瀏覽器 並且輸入 : Firefox Database Management






























4 . 加入 FireFox 工具列表中














5 . 安裝完後,開啟 FireFox 瀏覽器
按下 Alt 按鍵 !!!
按下 Alt 按鍵 !!!
按下 Alt 按鍵 !!!
點選應用程式















以上就是我們之後用來編輯的工具。

歡迎轉載,請註明出處。