目前分類:軟體開發 Software (5)

瀏覽方式: 標題列表 簡短摘要

這裡整理 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>

文章標籤

genlee 發表在 痞客邦 留言(0) 人氣()

一般程式設計時為了節省系統資源,對於時常頻繁使用的變數或陣列,宣告後會重覆使用,但這個方式在 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;
    }

文章標籤

genlee 發表在 痞客邦 留言(0) 人氣()

設定位於兩個地方,分別是 HKEY_LOCAL_MACHINE 和 HKEY_CURRENT_USER;

1. HKEY_LOCAL_MACHINE

HKEY_LOCAL_MACHINE
 -SOFTWARE
   -ODBC
    -Odbc.ini

 

2. HKEY_CURRENT_USER:

HKEY_CURRENT_USER
 -SOFTWARE
   -ODBC
    -Odbc.ini

文章標籤

genlee 發表在 痞客邦 留言(0) 人氣()

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

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

 

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();
    }

文章標籤

genlee 發表在 痞客邦 留言(0) 人氣()

軟體名稱:
匯率更新合庫版

軟體資訊:
版本:v1.0.19

語言:正體中文

作業系統:Windows 應該都可以

檔案大小:108 KB

是否需要安裝:Yes

安裝檔案大小:VB 自行封裝後就破 10MB 了..

文章標籤

genlee 發表在 痞客邦 留言(0) 人氣()