[教學] Android Studio 常見的錯誤訊息及解決方法 Gradle Error, Session ‘app’: Error Installing APK, Error:Execution failed for task

這裡整理 Android Studio 開發 Android APP 過程時,常遇到的問題及解決方法;

1. Android Studio 安裝並載入設定後,啟動舊有 code 專案,在首次Gradle build 時總是卡住,

自行執行 compile 時會出現以下錯誤:

Gradle error : Write access is allowed from event dispatch thread only in android studio

解決方法:

採用下列作法即可恢復正常,並將整個 android studio 關閉後再重新啟動,自動載入正確的 jre 即可恢復;

File -> Project Structure -> SDK Location), 勾選 'Use embedded JDK' checkbox and set jdk location to 'path to android studio'\Android Studio\jre

2.  Error message: Session ‘app’: Error Installing APK

解決方法:

File->Settings->Build, Execution, Deplyment -> Instant Run->Disable "Enable Instant Run to hot swap code..."

3. Error:Execution failed for task ‘:app:mergeDebugResources’

解決方法:

應該是 resources 資料夾中有錯誤的資料、或不應該存在的檔案,本次的原因是我在 strings.xml 中宣告一個含有空白項目的陣列,刪除空白後就恢復正常了。

    <string-array name="content_array">
<item>  </item>   //不應該加入這一項,會造成錯誤
<item>家樂福</item>
<item>大潤發</item>
</string-array>

[教學] Android Studio 重覆使用物件或 class 造成的問題及解決方法

一般程式設計時為了節省系統資源,對於時常頻繁使用的變數或陣列,宣告後會重覆使用,但這個方式在 Android Studio 中這麼做卻會造成錯誤或問題,範例如下:

public class TDB_Columns
{
public int iNo;
public String sName;
public String sLogDate;
public String sLog;
public int iRank;
};
//query from database and add all existed data to arraylist
public ArrayList<TDB_Columns> query_db_to_array()
{
ls_Result.setAdapter(null);
TDB_Columns DB_Columns=new TDB_Columns(); //<--------------Here is wrong
Cursor cursor = db.rawQuery("select * from FRecord_Table", null);
ArrayList<TDB_Columns> arrayStrings = new ArrayList<TDB_Columns>();
cursor.moveToFirst();
int iCount=0;
while (cursor.moveToNext()) {
DB_Columns.iNo=cursor.getInt(0);
DB_Columns.sLogDate=cursor.getString(1);
DB_Columns.sName=cursor.getString(2);
DB_Columns.sLog=cursor.getString(3);
DB_Columns.iRank=cursor.getInt(4);
arrayStrings.add(iCount, DB_Columns);
iCount++;
}
cursor.close();
return arrayStrings;
}

可以看到,因為 while 迴圈中會不斷以 DB_Columns 去儲存資料表中的資料,供後續使用,
所以我宣告一次 DB_Columns 物件後就重覆使用,因而造成編譯或執行過程中不如預期的問題。

 

正確的作法應該是:

 public ArrayList<TDB_Columns> query_db_to_array()
{
ls_Result.setAdapter(null);
Cursor cursor = db.rawQuery("select * from FRecord_Table", null);
ArrayList<TDB_Columns> arrayStrings = new ArrayList<TDB_Columns>();
cursor.moveToFirst();
int iCount=0;
while (cursor.moveToNext()) {
TDB_Columns DB_Columns=new TDB_Columns();  //<---Shall new a object here every time
DB_Columns.iNo=cursor.getInt(0);
DB_Columns.sLogDate=cursor.getString(1);
DB_Columns.sName=cursor.getString(2);
DB_Columns.sLog=cursor.getString(3);
DB_Columns.iRank=cursor.getInt(4);
arrayStrings.add(iCount, DB_Columns);
iCount++;
}
cursor.close();
return arrayStrings;
}

Android Studio 使用 SQLite Database 資料庫 教學 查詢 update 附程式碼

以下程式碼為自己參考相關資料,並依個人常用的需求編寫出的常用函數,

包括新建資料庫、新建資料表、清除資料、新增資料到資料庫中、查詢資料 (讀取資料)、篩選查詢資料。

 

Step 1: 建立資料表並儲存為 DBHelper.java,Android 

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "my.db";
private static final int DB_VERSION = 1;
private final static String _TableName = "Invoice_Item_Table"; //<-- table name
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
final String SQL = "CREATE TABLE IF NOT EXISTS " + _TableName + "( " +
"_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"_TITLE VARCHAR(50)" + ");";
db.execSQL(SQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
final String SQL = "DROP TABLE " + _TableName;
db.execSQL(SQL);
}
}

Step 2: 初始化資料庫變數:

private DBHelper DH = null;
private SQLiteDatabase db;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DH=new DBHelper(this);
db = DH.getWritableDatabase();
}

Step 3: 建立資料庫常用函數:

//Insert New record to Table
private void add(String Title){
ContentValues values = new ContentValues();
values.put("_TITLE", Title.toString());
db.insert("Invoice_Item_Table", null, values);
}
//read data from table
public ArrayList<String> query_db_to_array()
{
list_Item.setAdapter(null);
Cursor cursor = db.rawQuery("select * from Invoice_Item_Table", null);
ArrayList<String> arrayStrings = new ArrayList<String>();
while (cursor.moveToNext()) {
String sItemName=cursor.getString(1);
arrayStrings.add(sItemName);
}
cursor.close();
return arrayStrings;
}
//clear table
public void clear_db()
{
db.execSQL("delete from Invoice_Item_Table");
}
//close db
private void closeDB()
{
DH.close();
}
@Override
protected void onDestroy() {
super.onDestroy();
closeDB();
}

如何用 ODBC Driver 連線到 Synology NAS MySQL MariaDB Database Server

 

Step 1: 按下功能表,選擇「控制台」

snip_20160611112102.png

 

Step 2: 選擇「安全性」

snip_20160611112129.png

 

Step 3: 切換到「防火牆」頁面,選擇防火牆設定檔,並按下「編輯規則」

snip_20160611112149.png

 

Step 4: 選擇「Cloud Station, MySQL 資料庫, …」設定檔後,按「編輯」

snip_20160611112211.png

 

Step 5: 來到「編輯防火牆規則」頁面,按下「從內建服務的清單選取連接埠」右邊的「選擇」按鈕

snip_20160611112224.png

 

Step 6: 將右邊捲軸往下拉,找到「MySQL 資料庫 (3306 連接埠)」,並勾選它,變成「已啟動」狀態

snip_20160611112240.png

 

Step 7: 按下「確定」按鈕後,即可由 Windows 端以 ODBC Driver 連線到 NAS 上的 MySQL 資料庫。