当前位置:  编程技术>移动开发
本页文章导读:
    ▪hibernate 配备cascade 及all-delete-orphan        hibernate 配置cascade 及all-delete-orphan cascade几种取值:save-update:   级联保存(load以后如果子对象发生了更新,也会级联更新). 但它不会级联删除delete:              级联删除, 但不具备级.........
    ▪ JNI示范        JNI示例 一、JNI简介 JNI:Java Native Interface,是Java语言提供的一种通用接口,用于Java代码与本地化代码的交互。所谓本地化代码是指直接编译成的与机器相关的二进制代码,而非Java字节码.........
    ▪ EditText 文字印证       EditText 文字验证 android:numeric="integer"  只允许输入整数 android:numeric="true" 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入   android:digits="1234567890qwertyuiopasdfghjklzxcvbnm_"  .........

[1]hibernate 配备cascade 及all-delete-orphan
    来源: 互联网  发布时间: 2014-02-18
hibernate 配置cascade 及all-delete-orphan
cascade几种取值:

save-update:   级联保存(load以后如果子对象发生了更新,也会级联更新). 但它不会级联删除

delete:              级联删除, 但不具备级联保存和更新

all-delete-orphan: 在解除父子关系时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新.

all:                     级联删除, 级联更新,但解除父子关系时不会自动删除子对象.

delete-orphan:删除所有和当前对象解除关联关系的对象

none:...

级联保存和级联更新总是集合在一起的, 所以没单独的save 或 update


当关联双方存在父子关系,就可以在 set 处设定 cascade 为 all-delete-orphan

所谓父子关系,即指由父方控制子方的持久化周期,子方对象必须和一个父方对象关联。如果删除父方对象,应该级联删除所有关联的子方对象;如果一个子方对象不再和一个父方对象关联,应该把这个子方对象删除。

all-deleteorphan 的能力:

1. 当保存或更新父方对象时,级联保存或更新所有关联的子方对象,相当于 cascade 为 save-update

2. 当删除父方对象时,级联删除所有关联的子方对象,相当于 cascade 为 delete

3. 删除不再和父方对象关联的所有子方对象

解除父子关系的 java 语句例如:

customer.getOrders().remove(order);

order.setCustomer(null);

tx.commit();

如果 cascade 属性取默认值 null,当解除父子关系时,会执行如下 sql:

update ORDER set CUSTOMER_ID=null where ID=2

如果要把它也删掉,则设置:

<set   name="orders" cascade="all-delete-orphan" inverse="true">

<key column="CUSTOMER_ID" />

<one-to-many />

再运行时就会执行:delete from ORDERS where CUSTOMER_ID=2 and ID=2;

    
[2] JNI示范
    来源: 互联网  发布时间: 2014-02-18
JNI示例
一、JNI简介

JNI:Java Native Interface,是Java语言提供的一种通用接口,用于Java代码与本地化代码的交互。所谓本地化代码是指直接编译成的与机器相关的二进制代码,而非Java字节码之类的中间代码。Windows下面的可执行文件,DLL等,Linux下面的可执行文件和SO文件等,都是二进制代码。
JNI允许Java语言编写的程序与其他语言编写的程序库(DLL, SO)或可执行文件进行互操作,包括汇编、C、C++。
JNI产生的原因在于以下几种需求:
(1). 你的应用程序需要使用系统相关的功能,而Java代码不支持或是难以办到。这个比较典型的是实现托盘图标,有几种现成的方案都是用的JNI做的,名字好像是叫做TrayIcon和StayOnTop。当然啦,如果是用的Java1.6,那就要另当别论了。
(2). 已有其他语言写好的类库或程序,希望Java程序可以使用它们。
(3). 出于更高的性能要求,希望使用汇编或是C/C++语言来实现部分功能。

二、JNI的开发步骤

这里以使用C++编写本地化方法实现为例,开发一个使用JNI的Demo程序,具体步骤如下所示:

(1). 编写带有native方法的java类

(2). 使用javac命令编译所编写的java类

(3). 使用javah命令处理类文件,生成C/C++头文件

(4). 使用C/C++实现本地方法

(5). 将C/C++编写的文件生成动态连接库

三、Demo程序,Demo程序宣示了Java代码中调用C++的输出功能打印字符串,同时演示了使用C++的输入功能读取字符串,并使用System.out.println输出。

1. 编写带native方法的Java类

本示例中的源程序就一个Java类。如下所示:

// HelloJNI.java -- 简单的JNI入门示例。

// 2007-4-5 16:41:45

public class HelloJNI {

  public native void displayHello();

  public native void showTime();

  private native String getLine(String prompt);

  static {

    System.loadLibrary("hello");

  }

  public static void main(String[] args) throws Exception {

    HelloJNI hj = new HelloJNI();

    System.out.println("==> Demo 1: hello");

    hj.displayHello();

    System.out.println("==> Demo 2: time");

    hj.showTime();

    System.out.println("==> Demo 3: input");

    String input = hj.getLine("Type a line: ");

    System.out.println("User typed: " + input);

  }

}

说明:一共3个native方法,第一个简单的Hello,第二个使用<ctime>头文件中的相关函数计算当前时间,第三个读取输入。注意static语句块:

static {

        System.loadLibrary("hello");

}

在JVM载入HelloJNI类的时候加载动态库,System.loadLibrary()中的参数是我们要生成的动态库文件的名字,不包括扩展名,在Windows下面是hello.dll,Linux下面是hello.so,这个由Java自动识别。

2. 编译此类
javac HelloJNI 生成HelloJNI.class文件

3. 使用javah HelloJNI 生成C/C++头文件,生成的头文件不用任何修改。如下所示:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class HelloJNI */

#ifndef _Included_HelloJNI

#define _Included_HelloJNI

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class:      HelloJNI

* Method:     displayHello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloJNI_displayHello

  (JNIEnv *, jobject);

/*

* Class:      HelloJNI

* Method:     showTime

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloJNI_showTime

  (JNIEnv *, jobject);

/*

* Class:      HelloJNI

* Method:     getLine

* Signature: (Ljava/lang/String;)Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_HelloJNI_getLine

  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus

}

#endif

#endif

4. 编写C/C++实现文件,如下所示:

// HelloJNIImpl.cpp -- 自己编写的实现文件

// 2007-4-5 16:52:53

#include <jni.h>

#include <iostream>

#include <ctime>

#include <string>

#include <cstdio>

#include <windows.h>

#include "HelloJNI.h"

extern "C" {

  //

}

using namespace std;

JNIEXPORT void JNICALL Java_HelloJNI_displayHello(JNIEnv * env, jobject obj) {

  cout << "Hello, JNI tech. This is from C++!" << endl;

}

JNIEXPORT void JNICALL Java_HelloJNI_showTime(JNIEnv * env, jobject obj) {

  time_t sec;

  tm t;

  time_t loop;

  cout << "时间:";

  sec = time(NULL);

  t = *localtime(&sec);

  unsigned int hour = t.tm_hour;

  unsigned int mini = t.tm_min;

  unsigned int secd = t.tm_sec;

 

  if(hour < 10) {

  cout << "0" << hour;

  }

  else {

    cout << hour;

  }

  cout << ":";

  if(mini < 10) {

    cout << "0" << mini;

  }

  else {

    cout << mini;

  }

  cout << ":";

  if(secd < 10) {

    cout << "0" << secd;

  }

  else {

    cout << secd;

  }

  cout << endl;

}

JNIEXPORT jstring JNICALL Java_HelloJNI_getLine(JNIEnv * env, jobject obj, jstring prompt) {

  char buf[128] = {0};

  const char * str = (env)->GetStringUTFChars(prompt, 0);

//   printf("%s", str);

  cout << str;

  (env)->ReleaseStringUTFChars(prompt, str);

  string buffer;

  getline(cin, buffer);

//   scanf("%s", buf);

  return (env)->NewStringUTF(buffer.c_str());

}


说明:JNI Tutorial中使用的居然是像下面这样的代码,env指针的使用应该有误,敬请注意。

JNIEXPORT jstring JNICALL

Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)

{

char buf[128];

const char *str = (*env)->GetStringUTFChars(env, prompt, 0);

printf("%s", str);

(*env)->ReleaseStringUTFChars(env, prompt, str);

...

5. 生成本地库文件。笔者使用的vs2008 中的C++编译器。vs2008命令行工具生成DLL的命令:

cl -I<头文件目录1> -I<头文件目录2> -LD <C/C++源文件名> -Fe<生成的DLL文件名>

-I选项指定头文件目录,-LD指定C++源文件,-Fe指定生成的DLL文件名。将各个部分替换成实际的情况,实际使用的命令如下:

cl -C:\Java\jdk1.6.0_10\include -IC:\Java\jdk1.6.0_10\include\win32 -LD HelloJNIImpl.cpp -Fehello.dll


关于这里的cl命令使用,及在vs2008中使用请看下一篇文章Vs2008 与JNI示例。
6. 运行结果,如下图所示:

7. 自动化。其实步骤都很简单,所以可以使用Ant来完成。下面提供一个ANT Buildfile。使用之前请根据自己的实际情况修改相关属性。

注意:Builfile编码是UTF-8的。

build.xml

<?xml version="1.0" encoding="UTF-8"?>

<project default="help" basedir="." name="JNI_Hello">

  <property name="app.home" value="."></property>

  <!-- 设置头文件的目录,根据JDK具体的安装目录而定 -->

  <property name="h.dir1" value="C:/java/jdk1.5.0_10/include"></property>

  <property name="h.dir2" value="C:/java/jdk1.5.0_10/include/win32"></property>

 

  <!-- 设置cl工具的路径,视具体情况而定 -->

  <property name="vc.bin.dir"

    value="C:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/bin">

  </property>

  <property name="cpp.name" value="HelloJNIImpl.cpp"></property>

  <property name="dll.name" value="hello.dll"></property>

  <target name="compile" description=" ==> 编译Java源文件">

    <javac srcdir="${app.home}" destdir="${app.home}">

    </javac>

  </target>

  <target name="javah" description=" ==> 生成C/C++头文件">

    <javah destdir="${app.home}" force="yes" />

  </target>

 

  <target name="dll" description=" ==> 调用cl命令生成相关的DLL文件">

    <exec dir="${app.home}" executable="${vc.bin.dir}/cl.exe" os="Windows XP">

      <!-- 参数-EHsc好像是VS.NET2003中cl.exe的,可以不加,参考下面的注释行 -->

      <arg line="-EHsc -I${h.dir1} -I${h.dir2} -LD ${cpp.name} -Fe${dll.name}"/>

      <!--

      <arg line="-I${h.dir1} -I${h.dir2} -LD ${cpp.name} -Fe${dll.name}"/>

      -->

    </exec>

  </target>

  <target name="run" description=" ==> 运行">

    <java classname="HelloJNI"></java>

  </target>

  <target name="all" description=" ==> 自动进行上面任务列表">

    <antcall target="compile"/>

    <antcall target="javah"/>

    <antcall target="dll"/>

    <antcall target="run"/>

  </target>

  <target name="help" description=" ==> 显示帮助信息">

    <echo>用法帮助:</echo>

    <echo>ant compile      编译Java源文件</echo>

    <echo>ant javah        生成C/C++头文件</echo>

    <echo>ant dll          调用cl命令生成相关的DLL文件</echo>

    <echo>ant run          运行</echo>

    <echo></echo>

    <echo>ant all          自动进行上面任务列表</echo>

    <echo>ant help         显示帮助信息</echo>

  </target>

</project>

Done!^_^!

JNI还有很多高级的功能,这里我就不说了,一来是不太会,二来也没什么意义。JNI Tutorial上讲得很全面,不错。

    
[3] EditText 文字印证
    来源: 互联网  发布时间: 2014-02-18
EditText 文字验证

android:numeric="integer"  只允许输入整数

android:numeric="true" 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入

 

android:digits="1234567890qwertyuiopasdfghjklzxcvbnm_"   如果输入中文是不会显示

 

android:hint="请输入数字!"   设置显示在空间上的提示信息

android:singleLine="true"       设置单行输入,一旦设置为true,则文字不会自动换行。

android:password="true"           设置只能输入密码

android:text

android:capitalize = "characters"   以大写字母写

android:textScaleX="1.5"    控制字与字之间的间距

android:typeface="monospace"   字型,normal, sans, serif, monospace

android:background="@null"  空间背景,这里没有,指透明


android:editable="false" 设置EditText不可编辑

 android:ellipsize="end" 自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时

 

 

 

 

1.       设定 EditText 的滚动条、对齐方式、行数、和提示 (hint) 及其颜色

         在布局文件,比如 main.xml 中,增加

         < EditText

                   android:id = "@+id/EditText01"

                   android:layout_width = "fill_parent"

                   android:layout_height = "wrap_content"

                   android:hint = "type something here... 请输入 ..."                            // 输入提示

                   android:textColorHint = "#FF00FF"                                                     // 提示文字的颜色

                   android:lines = "4"                                                                                 // 行数

                   android:gravity = "top"                                                                           // 上对齐

                   android:scrollbars = "vertical"                                                             // 垂直滚动条

         />

 

         在 Activity 对应的 Java 文件中,指定包含上述代码的 Layout( 即 main.xml) :

         setContentView(R.layout. main );

 

         得到的结果如下:

         

         

 

 

2.     设定 EditText 中的文字大小、文字颜色和 EditText 的背景颜色

在布局文件中,增加类似如下代码:

         < EditText

                   android:id = "@+id/EditText02"

                   android:layout_width = "fill_parent"

                   android:layout_height = "wrap_content"

                   android:textSize = "50sp"

                   android:textColor = "#FF0000"

                   android:background = "#007F00"

         />

 

得到的结果如下:

 

 

 

 

3.      输入过滤器的使用 (Input Filter)

输入过滤器,可以用来规范在 EditText 中输入的内容。比如:

        EditText txt02 = (EditText)findViewById(R.id. EditText02 );

        txt02.setFilters( new InputFilter[]

               {

                    new InputFilter.AllCaps(),

                    new InputFilter.LengthFilter(2)

           });

         则 txt02 这个 EditText 最多接收 2 个字符 ( 或者中文字 ) ,并且会自动转换为大写。

 

         程序员可以自己定义 InputFilter ,类似的代码如下 ( 必须重写 InputFilter 接口中定义的 filter 方法 ) :

class CustomizedInputFilter implements InputFilter

{

              public CharSequence filter(CharSequence source, int start, int end,

                     Spanned dest, int dstart, int dend)

              {

//            Log.e("debug", (String)source);

//            return (new String((String)source).toUpperCase());

                     // 下面是 InputFilter.AllCaps() 的源代码

                     for ( int i = start; i < end; i++)

                     {

                            if (Character.isLowerCase (source.charAt(i)))

                            {

                                   char [] v = new char [end - start];

                                   TextUtils.getChars (source, start, end, v, 0);

                                   String s = new String(v).toUpperCase();

 

                                   if (source instanceof Spanned)

                                   {

                                      SpannableString sp = new SpannableString(s);

                                      TextUtils.copySpansFrom ((Spanned) source, start, end, null , sp, 0);

                                      return sp;

                                   }

                                   else

                                   {

                                      return s;

                                   }

                             }

                     }

                     return null ; // keep original

              }

       }

 

 

4.     指定 EditText 为密码输入框和设定 EditText 激活状态

         < EditText

                   android:id = "@+id/EditText03"

                   android:layout_width = "fill_parent"

                   android:layout_height = "wrap_content"

                   android:password = "true"                                                 // 密码输入框,会屏蔽输入的字符

         />

        

         < EditText

                   android:id = "@+id/EditText04"

                   android:layout_width = "fill_parent"

                   android:layout_height = "wrap_content"

                   android:enabled = "false"                                                  // 设定活动状态为 false ,既不能编辑,也不能

         />                                                                                                      // focusable

         具体效果就不演示了。

 

5.     AutoCompleteTextView 的使用

AutoCompleteTextView 可以被认为是一种特殊的 EditText ,用户在 AutoCompleteTextView 中输入部分字符,就会得到和该输入字符匹配的列表,该列表由开发人员事先提供,用户只需要选择其中之一即可,这样可以节省用户输入的字符数,同时也可以减少出错的机会。比如,在布局文件 main.xml 中,有如下代码:

         < AutoCompleteTextView

                   android:id = "@+id/AutoCompleteTextView01"

                   android:layout_width = "fill_parent"

                   android:layout_height = "wrap_content"

                   android:completionHint = "Pick a country or type your own"                            // 下拉列表的提示

                   android:dropDownHeight = "120px"                                                                     // 下拉列表的高度

                   android:completionThreshold = "1"                                                                      // 键入多少字符,即可出现下拉列表

         />

 

在 Activity 对应的 java 文件中:

public class ControlEditText extends Activity

{

       // 定义一个字符串数组

               final String[] COUNTRIES = { "China" , "Cuba" , "Costa Rica" ,

                        "Columbia" , "Canada" , "America" ,

                        "Africa" , "Belgium" , "India" };

               @Override

               public void onCreate(Bundle savedInstanceState)

               {

                    super .onCreate(savedInstanceState);

                    setContentView(R.layout. main );

       

                     // 构建一个 ArrayAdapter 对象

                    ArrayAdapter<String> adapter = new ArrayAdapter<String>( this ,

                             android.R.layout. simple_dropdown_item_1line ,

                             COUNTRIES );

       

                    // 获取 AutoCompleteTextView 对象 text

                    AutoCompleteTextView text = (AutoCompleteTextView)findViewById(R.id. AutoCompleteTextView01 );

                    // 给 text 指定 ArrayAdapter 对象

                    text.setAdapter(adapter);

               }

}

 

 

其中用到的 ArrayAdapter 构造方法说明如下:

public ArrayAdapter ( Context context, int textViewResourceId, T[] objects)

 

Parameters

context

The current context.

textViewResourceId

The resource ID for a layout file containing a TextView to use when instantiating views.

在 android.R.layout 包下,定义了许多诸如 simple_dropdown_item_1line 这样的 TextView 资源ID

objects

The objects to represent in the ListView.

 

运行代码,得到的结果如下:

 

 

输入一个字符 c ,则 adapter 中所有以 c( 缺省地,不区分大小写 ) 大头的国家,会全部显示在下拉列表中,用户仅需要做一个简单的选择就可以了。如果 android:completionThreshold 的属性为 "2" ,那么用户需要输入两个字符,下拉列表才会出现。

 

         选择输入完成后,用户可以继续在上面的 EditText 中继续输入。

 

 

6.     MultiAutoCompleteTextView 的使用

MultiAutoCompleteTextView 也可以被认为是一种特殊的 EditText ,它的作用基本上和 AutoCompleteTextView 一样:用户在MultiAutoCompleteTextView 中输入部分字符,就会得到和该输入字符匹配的列表,该列表由开发人员事先提供,用户只需要选择其中之一即可,这样可以节省用户输入的字符数,同时也可以减少出错的机会。

 

它和 AutoCompleteTextView 唯一不同的地方就是: AutoCompleteTextView 只有第一个输入的单词可以 auto complete ,而MultiAutoCompleteTextView ,则可以多次进行 auto complete 。在使用 MultiAutoCompleteTextView 的时候,要提供tokenizer , tokenizer 用于分隔单词。比如,在布局文件 main.xml 中,有如下代码:

         < MultiAutoCompleteTextView

                   android:id = "@+id/MultiAutoCompleteTextView01"

                   android:layout_width = "fill_parent"

                   android:layout_height = "wrap_content"

                   android:completionHint = "Pick a country or type your own"

                   android:dropDownHeight = "120px"

                   android:completionThreshold = "1"

         />

 

在 Activity 对应的 java 文件中:

public class ControlEditText extends Activity

{

               final String[] COUNTRIES = { "China" , "Cuba" , "Costa Rica" ,

                        "Columbia" , "Chizen" , "Canada" , "America" ,

                        "Africa" , "Belgium" , "India" };

               @Override

               public void onCreate(Bundle savedInstanceState)

               {

                    super .onCreate(savedInstanceState);

                    setContentView(R.layout. main );

       

                    ArrayAdapter<String> adapter = new ArrayAdapter<String>( this ,

                             android.R.layout. simple_dropdown_item_1line ,

                             COUNTRIES );

       

                    AutoCompleteTextView text = (AutoCompleteTextView)findViewById(R.id. AutoCompleteTextView01 );

                    text.setAdapter(adapter);

       

                    // 获取 MultiAutoCompleteTextView 对象 text

                    MultiAutoCompleteTextView mtext =

                                      (MultiAutoCompleteTextView)findViewById(R.id. MultiAutoCompleteTextView01 );

                    // 依然使用前面构造好的 ArrayAdapter 对象

                    mtext.setAdapter(adapter);

                     // 指定分隔符 ”,”

                    mtext.setTokenizer( new MultiAutoCompleteTextView.CommaTokenizer());

               }

}

 

         结果如下:

         

我们可以看到,输入 c ,然后可以在下拉列表中选择 China ,会自动增加一个分隔符。此时,输入 a ,则会把和 a 匹配的America 以及 Africa 显示在下拉列表中。

 

如果我们把 COUNTRIES 数组中的内容改为中文:

final String[] COUNTRIES = { " 印度 " , " 印度尼西亚 " , " 新加坡 " ,

               " 新赤道几内亚 " , " 巴基斯坦 " , " 南非 " , " 南斯拉夫 " ,

               " 北非 " , " 北爱尔兰 " , " 巴勒斯坦 " };

可以看到, AutoCompleteTextView 和 MultiAutoCompleteTextView 都支持中文:

 

          

 

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
php iis7站长之家
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,