安卓開發

學習本章,你需要已經學完後台開發,在本章中,我們會演示在安卓端或Java客戶端如何調用後台開發中已經完成並部署的Service對象。


創建工程

使用Java開發工具NetBeans創建工程Test-SDK

  1. 創建Java Class Library類型的工程
  2. 輸入工程名稱Test-SDK
  3. 切換至Files視圖,新建目錄lib

  4. 將nepenthes.jar, commons-codec-1.10.jar, jackson-annotations-2.0.6.jar, jackson-core-2.0.6.jar, jackson-databind-2.0.6.jar複製到剛剛建立的目錄lib下,這些庫文件請到下載頁面下載。
  5. 切換至Projects視圖,打開Test-SDK工程節點,選中節點Libraries,右鍵從快捷菜單中選擇Add Jar/Folder
  6. 選擇Test-SDK下的lib目錄,選中剛才複製進入的所有jar文件

  7. 創建包org.everdow.nepenthes.test.json和org.everdow.nepenthes.test.blsync
  8. 在包org.everdow.nepenthes.test.json下創建UserxJson.java,並實現如下圖所示:
    package org.everdow.nepenthes.test.json;
    import org.everdow.nepenthes.client.AbstractJson;
    
    public class UserxJson extends AbstractJson
    {
        public String ID="0";
        public String FirstName="";  //名(MaxLen=20)
        public String LastName="";  //姓(MaxLen=20)
        public String Gender="";  //性別
        public String Birthdate="";  //出生日期
        public String Salary="";  //薪水(MaxLen=10)
        public String RegisteredTime="";  //註冊時間
        public String Memo="";  //備注
    }
  9. 在包org.everdow.nepenthes.test.blsync下創建BLSyncUserx.java,並實現如下所示:
    package org.everdow.nepenthes.test.blsync;
    import org.everdow.nepenthes.test.json.UserxJson;
    import com.fasterxml.jackson.core.type.TypeReference;
    import java.io.IOException;
    import java.util.List;
    import org.everdow.nepenthes.client.BLSyncAbstract;
    
    public class BLSyncUserx extends BLSyncAbstract
    {
        public boolean insert(UserxJson json) throws IOException
        {
            return super.insert(json);
        }
        
        @Override
        public boolean delete(String whereClause) throws IOException
        {
           return super.delete(whereClause);
        }
        
        public boolean deleteByID(String ID) throws IOException
        {
            return this.delete("ID="+ID);
        }
        
        public boolean update(UserxJson json) throws IOException
        {
            return super.update(json);
        }
        
        @Override
        public int getCount(String whereClause) throws IOException
        {
            return super.getCount(whereClause);
        }
        
        public List select(String whereClause) throws IOException
        {
            TypeReference> typeRef = new TypeReference>(){};
            return super.select(typeRef,whereClause);
        }
        
        public List select(String whereClause,String index,String step) throws IOException
        {
            TypeReference> typeRef = new TypeReference>(){};
            return super.select(typeRef,whereClause,index, step);
        }
        
        public UserxJson getJson(String ID) throws IOException
        {
            UserxJson json=null;
            List list=this.select("ID="+ID);
            if(!list.isEmpty())
            {
                json=(UserxJson)list.get(0);
            }
            return json;
        }
    }
    
  10. 在包根位置將Nepenthes安卓許可文件Config.properties複製,請根據實際情況修改Protocol, Host, Port和Context的值,如果你一直嚴格按照文件進行培訓,則不必修改。
    # license user
    LicenseUser=test@android
    
    # license password
    LicensePassword=test000
    
    # license package
    LicensePackage=org.everdow.nepenthes.test
    
    # license type
    LicenseType=Android
    
    # license
    License=67ce325a1880d7d18d9040d067fc8d73966d2dc1fbe7cb222384b390c51f9cb090ce1c95af1803f1476525f52bc39259379633b4814445c42fb71eec8d619d58
    
    # protocol: http or https
    Protocol=http
    
    # server IP or domain
    Host=localhost
    
    # port: 80 or 443
    Port=80
    
    # web context
    Context=Test
    
    # service password
    ServicePassword=Test
    
  11. LicenseTest.java:驗證Nepenthes安卓端許可。
    package org.everdow.nepenthes.test;
    
    import org.everdow.nepenthes.util.MiscTool;
    import org.everdow.nepenthes.test.json.UserxJson;
    
    public class LicenseTest 
    {
        public static void main(String args[])
        {
            int licenseCode=MiscTool.hasLicensed(new UserxJson());
            String licenseMsg=MiscTool.getLicenseMessage(licenseCode);
            System.out.println(licenseMsg);
        }
    }

    驗證Nepenthes許可返回值

    描述 備注
    800 License Passed 許可驗證通過,可以正常使用。
    801 License User or License Password Wrong 許可用戶名或密碼錯誤。
    802 License Wrong 許可錯誤
    803 License Disabled 許可被禁用。
    804 License Expired 許可過期。
    805 License Type Unmatch 許可類型不匹配。
    806 License Verify Exception 許可驗證異常。
    807 License Server Fail 許可服務器故障。
    808 License Package Error 許可包錯誤。
    809 License Auto Destroy 許可自動銷毀。
    810 Config.properties doesn't contain LicenseUser Config.properties未包含許可用戶。
    811 Config.properties doesn't contain LicensePassword Config.properties未包含許可密碼。
    812 Config.properties doesn't contain LicenseType Config.properties未包含許可類型。
    813 Config.properties doesn't contain LicensePackage Config.properties未包含許可包。
    814 Config.properties doesn't contain License Config.properties未包含許可。
  12. InsertTest.java:在包org.everdow.nepenthes.test中創建,該示例中用到了BLSync對象的insert方法,直接在NetBeans中運行該文件,如果返回true,則表示遠程插入數據庫成功。同時也打開PostgreSQL的客戶端psql驗證是否成功插入。
    package org.everdow.nepenthes.test;
    
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.everdow.nepenthes.test.blsync.BLSyncUserx;
    import org.everdow.nepenthes.util.MiscTool;
    import org.everdow.nepenthes.test.json.UserxJson;
    
    public class InsertTest 
    {    
        public static void main(String args[])
        {
            try 
            {
                UserxJson userxJson=new UserxJson();
                userxJson.FirstName="曉輝";
                userxJson.LastName="李";
                userxJson.Gender="1";
                userxJson.Birthdate="1975-11-18";
                userxJson.Salary="90000";
                userxJson.RegisteredTime=MiscTool.getNow();
                userxJson.Memo="李曉輝是Nepenthes的作者。";
                
                BLSyncUserx blSyncUserx=new BLSyncUserx();
                boolean flag=blSyncUserx.insert(userxJson);
                System.out.println("Insert:"+flag);
            } 
            catch (IOException ex) 
            {
                Logger.getLogger(InsertTest.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
  13. UpdateTest.java:在包org.everdow.nepenthes.test下創建,該示例中用到了BLSync對象的getJson方法和update方法,源代碼如下:
    package org.everdow.nepenthes.test;
    
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.everdow.nepenthes.test.blsync.BLSyncUserx;
    import org.everdow.nepenthes.test.json.UserxJson;
    
    public class UpdateTest 
    {
        public static void main(String args[])
        {
            try 
            {
                BLSyncUserx blSyncUserx=new BLSyncUserx();
                //getJson的入參為ID的值,請根據psql中查詢的實際ID值使用。
                UserxJson userxJson=blSyncUserx.getJson("2");
                userxJson.Birthdate="1975-10-16";
                boolean flag=blSyncUserx.update(userxJson);
                System.out.println("Update:"+flag);
            } 
            catch (IOException ex) 
            {
                Logger.getLogger(UpdateTest.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
  14. GetCount.java:在包org.everdow.nepenthes.test下創建,對BLSync對象的getCount方法進行使用示範,入參為whereClause,即SQL關鍵字WHERE後的條件語句。
    package org.everdow.nepenthes.test;
    
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.everdow.nepenthes.test.blsync.BLSyncUserx;
    
    public class GetCount 
    {
        public static void main(String args[])
        {
            try 
            {
                BLSyncUserx blSyncUserx=new BLSyncUserx();
                String whereClause="1=1";   //1=1表示查詢所有的記錄
                int count=blSyncUserx.getCount(whereClause);
                System.out.println("getCount:"+count);
            } 
            catch (IOException ex) 
            {
                Logger.getLogger(GetCount.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
  15. SelectTest.java:演示BLSync對象的select方法使用,select方法有兩個版本,第一個入參是whereClause,查詢出所有符合條件的數據庫記錄;第二個版本有三個入參,第一個入參是whereClause,第二個入參是pos,代表數據庫的游標位置,第三個入參是step,標明每次查詢數據庫的記錄最大數量。返回List類型的集合,其元素在取出來使用時,需要進行強製造型為UserxJson。通常第二個select方法是為了分頁顯示時使用。
    package org.everdow.nepenthes.test;
    
    import java.io.IOException;
    import java.util.List;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.everdow.nepenthes.test.blsync.BLSyncUserx;
    import org.everdow.nepenthes.test.json.UserxJson;
    
    public class SelectTest 
    {
        public static void main(String args[])
        {
            try 
            {
                BLSyncUserx blSyncUserx=new BLSyncUserx();
                List result=blSyncUserx.select("1=1");
                for(Object record:result)
                {
                    UserxJson userxJson=(UserxJson)record;
                    System.out.println(userxJson.LastName+" "+userxJson.FirstName);
                }
            } 
            catch (IOException ex) 
            {
                Logger.getLogger(SelectTest.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
    }
  16. DeleteTest.java:示例了BLSync對象的兩個delete方法,第一個方法為deleteByID,入參為數據庫記錄ID值,執行一次僅刪除一條記錄;第二個為delete,入參為whereClause,刪除所有符合條件的數據庫記錄。
    package org.everdow.nepenthes.test;
    
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.everdow.nepenthes.test.blsync.BLSyncUserx;
    
    public class DeleteTest 
    {
        public static void main(String args[])
        {
            try 
            {
                BLSyncUserx blSyncUserx=new BLSyncUserx();
                //在實際中,請使用psql檢查出的ID值。以下方法等於delete("ID=2")
                boolean flag=blSyncUserx.deleteByID("2");
                System.out.println("Delete:"+flag);
            } 
            catch (IOException ex) 
            {
                Logger.getLogger(DeleteTest.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
  17. 在實際的安卓項目或Java應用中,將Test-SDK執行Clean and Build,將生成的Test-SDK.jar加入至安卓項目或Java應用項目中作為jar庫引用即可使用。