2019年7月25日 星期四

關於 Embarcadero RAD Studio 10.3 Update 2 - Android build-tools


安裝後 Android SDK並沒有安裝完整
請依下列步驟
C:> CD C:\Users\Public\Documents\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows\tools
C:> android.bat update sdk --no-ui --all --filter platform-tools,build-tools-28.0.2,android-26




安裝後的目錄如下
C:\Users\Public\Documents\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows\build-tools\28.0.2



2019年7月24日 星期三

RAD Studio: 重新編譯 TeeChart


這個好像只有在中文環境的Windows 才會發生

解決方法
  先把作業系統語系換成英文
  編譯完成後 再換回中文

Cannot recompile Delphi package:
VCLTee.TeeConst.pas(612) Error: E2066 Missing operator or semicolon
VCLTee.TeeConst.pas(1014) Error: E2066 Missing operator or semicolon







2019年7月17日 星期三

iOS swift 5: Thread Mode-String Array Index Out of Range


  在兩個Thread中同時對同一個 String Array進行快速的 append 和 remove
  就會發生 Index Out of Range

  已使用網路上找到的各種修改 extension Array方案都無效
 


     
  var dataList = [String]()
  ...
  func Thread1_RemoveFun()
  {
   ...
   DispatchQueue.global().async  /* 問題就出在這一行 */ 
   {
    ...
    if( dataList.Count > 0)  
    {
     dataList.remove(at: 0)
    }  
    ...
   } 
   ...
  }
  
  func Thread2_AppendFun()
  {
   ...
    dataList.append("Test")
   ...
  }
  
  func Thread3_ReadFun()
  {
   if( nIndex < dataList.Count)  
   {
    // dataList.count 輸出是 1 但還是發生
    // 用Debug breakpoint去看, dataList.count 盡然是 0
    print( \(dataList.count)"
    readStr = dataList[nIndex] 
   } 
  }



同一個head, Auto Express 和 Add Express 竟然顯示不同數值
搞不懂...


2019年7月2日 星期二

iOS swift 5: Xcode Project SQLite Bundle


  解決方案來源:
   bundle to documents directory in iOS
 
 
  Step 1: 把 SQLite的資料庫檔案MyDatabase.db 拖拉到 Xcode Project中
  Step 2: 設定 Copy Bundle Resources 加入剛才拖拉到 Xcode Project中MyDatabase.db

 
  Step 3:
func copyfileToDocs()
{
        let bundlePath = Bundle.main.path(forResource: "MyDatabase", ofType: ".db")
        print(bundlePath!, "\n") //prints the correct path
        let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        let fileManager = FileManager.default
        let fullDestPath = NSURL(fileURLWithPath: destPath).appendingPathComponent("fj200ls.db")
        let fullDestPathString = fullDestPath?.path
        print(fileManager.fileExists(atPath: bundlePath!)) // prints true
        do
        {
            try fileManager.copyItem(atPath: bundlePath!, toPath: fullDestPathString!)
            print("DB Copied")
        }
        catch
        {
            print("\n")
            print(error)
        }
}



2019年7月1日 星期一

iOS swift 5: SQLite 用法

都試過後, 選擇使用 FMDB 方式, 比較簡單


 方式1:
  解決方案來源:
   Accessing an SQLite Database in Swift
   Swift起步走-SQLite 
   在iOS裡操作SQLite筆記 - 資料集(一)
   Swift SQLite Tutorial for Beginners – Using SQLite in iOS Application
   muhlenXi-使用FMDB 管理SQLite 數據庫

 方式2: 使用 SQL.swift
  SQLite.swift
  SQLite.swift簡單實用筆記
  iOS Swift 4.0:第三方SQLite框架SQLite.swift 使用(一)

  如果是使用 swift 5 安裝流程
  一定要使用
[sudo] gem install cocoapods

target 'YourAppTargetName' do
    pod 'SQLite.swift', '~> 0.12.0'
end
pod install --repo-update



 方式3:
  解決方案來源:
   FMDB與SQLite 數據庫應用示範
  iOS - 利用 FMDB 第三方框架來操作 SQLite 檔案
  Swift - 第三方SQLite庫FMDB使用詳解1(安裝配置、工具類封裝)