安卓开发

学习本章,你需要已经学完后台开发,在本章中,我们会演示在安卓端或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库引用即可使用。