各位大大是否在開發介面上發生以下的問題
Design editor is unavailable until a successful build !
此版本為
上網查解法有二 :
1 . Build -> Rebuild Project
效果有限...
2 . 先去除你程式原有的錯誤,重新執行程式。
clean error code and rerun application.
( Example )
歡迎轉載,請註明出處。
2018年1月10日 星期三
2018年1月7日 星期日
Android-SQLite 使用 SQLiteOpenHelper (六)_查詢資料( Select )
此篇說明如何查詢對應的結果
1 . 全部結果查詢
2 . 查詢條件結果
查詢結果出來的容器 Cursor 是什麼?我要怎麼藉由此東西取出我要的值?
官方說明為
還是不懂怎辦?
可以把它想成是一種 Map
取出來的順序必須依照欄位的順序
不然會取不到對應的值
參考資料:時間區間格式
歡迎轉載,請註明出處。
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 . 刪除資料
為什麼 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 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 . 修改資料
為什麼 strSQL 不用放完整字組?為什麼條件參數要提出來?
要解這些問題前就必須追程式碼了
原來內部方法已經將修改指令寫在內部
所以我們只要編寫 Where 後的指令
那為什麼要用 String 裝條件的變數?
也是因為上圖最後幾行所提出來的
依照集合內的參數依序擺放
其實擺放參數有以下此方法 :
1 . 用集合方法( 如上方 )
2 . 只接將參數寫在條件內
參考資料:SQLiteBrowser
歡迎轉載,請註明出處。
此篇我們要提到的是修改資料
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 . 新增資料
為什麼 insert 方法欄位有一個 null ?? 這欄位的用途是啥?
nullColumnHack :
簡單來說,SQLite 無法像 SQL 直接放置空值
所以必須給一個欄位名稱讓他產生充滿 null 的一列
還是不了解?那我們來實作一番
這是原本的 Table
我們執行指令後
再次執行指令
如果我們有需要用到此方法
最後一欄一定要 null
此篇我們要來談
如何創立簡單的新增、修改、刪除、查詢方法
以便於我們後續使用
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
2 . SQLiteOpenHelper 須提供的參數
name : DataBase 的名稱。
factory : 若無使用到指標,則預設為 null。
version : 如果版號與先前不同,則會觸發 onUpgrade。
3 . 將上一篇我們所需要的參數提出,並將建構子更改成我們需要的
4 . 建立我們所需要的 資料表( Table )
備註: Table如果需多個 Table 也在此建立
5 . 處理版本升級問題
先記錄問題
1 . onUpgrade 觸發的實際時機
上一篇我們有先規劃我們想要產出的表格
那此篇就開始 簡易教學吧
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 觸發的實際時機
2017年12月30日 星期六
Java-切割、分割字串
想必各位大大對這需求一定不陌生吧
在此紀錄下來
希望大家一起分享一起交流
切割字串解析成每個字元
1 . 方法一
2 . 方法二
藉由特定的字串切割( Split )
1 . 字串切割
2 .字串切割,但限制條件
歡迎轉載,請註明出處。
在此紀錄下來
希望大家一起分享一起交流
切割字串解析成每個字元
1 . 方法一
String s = "abcd,efgh";
System.out.println("Use String method : Char Array");
char[] a = s.toCharArray();
for (char c : a) {
System.out.println(c);
}
Use String method : Char Array
a
b
c
d
,
e
f
g
h
2 . 方法二
String s = "abcd,efgh";
System.out.println("Use String method : String length and char At");
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
System.out.println(c);
}
Use String method : String length and char At
a
b
c
d
,
e
f
g
h
藉由特定的字串切割( Split )
1 . 字串切割
String s = "abcd,efgh";
System.out.println("Use String method : Split");
String[] strs = s.split(",");
for(String str: strs) {
System.out.println(str);
}
Use String method : Split
abcd
efgh
2 .字串切割,但限制條件
String s = "abcd,efgh,ijkl,mnop,qrst";
System.out.println("Use String method : Split limit");
for (String retval : s.split(",", 3)) {
System.out.println(retval);
}
Use String method : Split limit
abcd
efgh
ijkl,mnop,qrst
歡迎轉載,請註明出處。
訂閱:
文章 (Atom)










