2018年1月18日 星期四

Eclipse-如何在編寫時自動帶入方法

常常在用 Eclipse  開發的各問大大
是否會因為編寫時候
沒有自動產生出可以使用的方法列表

















Intelli-sense
•Windows -> Preferences -> Java -> Editor -> Content Assist
•Auto Activation -> Auto Activation Trigger for Java
•Change "." to ".(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
Eclipse-自動添加

2018年1月14日 星期日

Linux-如何在 Window 下安裝 VirtualBox 執行 Linux

在 Window 環境下要如何執行 Linux ?
整體流程是怎樣了 ?

執行步驟 :
1 . 安裝 VirtualBox


























2 . 官網下載 Linux 的 Ubuntu 版本 : 官方網站

























































3 . 執行 VirtualBox ,並且安裝程序步驟




















4 . 設定主機參數















5 . 點選確定後,執行啟動













6 . 成功畫面




















歡迎轉載,請註明出處。

2018年1月10日 星期三

Android-AndroidStudio 3.0 無法正常使用 UI 設計介面

各位大大是否在開發介面上發生以下的問題
Design editor is unavailable until a successful build !













此版本為

















上網查解法有二 :
1 . Build -> Rebuild Project
效果有限...

2 . 先去除你程式原有的錯誤重新執行程式
clean error code and rerun application.







( Example )



歡迎轉載,請註明出處。

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 觸發的實際時機