2012年04月12日

javaの修飾子の種類


修飾子一覧
修飾子一覧
修飾子 クラス インタフェース メソッド コンストラクタ ブロック 変数 説明
public
×
アクセス修飾子
protected
×
アクセス修飾子
private
×
アクセス修飾子
static
×
×
スタティック修飾子
final
×
×
×
ファイナル修飾子
abstract
×
×
×
抽象修飾子
native
×
×
×
×
×
ネイティブ修飾子
synchronized
×
×
×
×
同期修飾子
transient
×
×
×
×
×
一時的修飾子
volatile
×
×
×
×
×
揮発性修飾子
strictfp
×
×
×
×
×
厳密浮動小数修飾子
const
×
×
×
×
×
×
定数


アクセス修飾子(public, protected, private)
public、protected、private は アクセス修飾子 と呼ばれ
指定した変数やクラスなどを、どの範囲から参照可能かを表すのに用いられます

public:すべてのクラスからの参照可能
protected:他ファイル・他クラスからのアクセスをプロテクトする
private:自クラスからのアクセスのみ可能
public class Test1 {//Test1はどこからでもアクセス可能
	public int public_int;
	//public_intはどこからでもアクセス可能
	protected int protected_int;
	//protected_intはファイル内でならアクセス可能
	private int private_int;
	//private_intはTest1内でのみアクセス可能
}
class Sub_Test1 extends Test1{//Test1のサブクラス
	//public_int・protected_intはアクセス可能
	//private_intはアクセス不可
}

スタティック修飾子(static)
static は、クラスがインスタンス化されていなくても
そのクラス・メソッド・変数などを参照可能であることを示します
インスタンス化とは・・・
static class Test{
	public static int bai(int test_int) {
		return test_int*2;
    }
}

public class Test2{
	//static 宣言されていれば
	int x = Test.bai(y);// 直接呼び出せる
	//static 宣言されていなければ
	Test test = new Test();// インスタンス化が必要
	int x2= test.bai(y2);
}


ファイナル修飾子(final)
finalは上書きされないことを意味します
クラスに用いた場合はサブクラスを定義できません
メソッドに用いた場合はサブクラスでメソッドをオーバーロードできません
変数に用いた場合はその変数を変更できないことを意味します

抽象修飾子(abstract)
abstractは、クラス・インタフェース・メソッドが不完全なものであることを示します
抽象クラスはそのままではインスタンス化することができません
自分もよくわかっていませんwww

ネイティブ修飾子(native)
nativeはメソッドに使用しがネイティブメソッド
であることを示します
ネイテブメソッドは型、メソッド名、引数の型といった作法のみを定義するもので
中身は別途実装する必要があります

同期修飾子(synchronized)
synchronizedメソッドがマルチスレッド環境で実行される場合
メソッドのインスタンスを対象として排他制御が行われます
排他制御とは
あるスレッドがアクセスしているときに、別のスレッドが重ねてアクセスしようとすると
先に使っていたスレッドによる処理が終了するまで待機させられます
またsynchronized修飾されたメンバーは、一つのスレッドにアクセスされるとロックされて
マルチスレッドによる同時アクセスを防ぐことが出来ます

一時的修飾子(transient)
オブジェクトをストリーム化(直列化)すると、オブジェクトをそのままファイルとして保存したり
ネットワークを介してやりとりすることができるようになります
(またはシリアライズといいます)
transient修飾子付きの変数は一時的な変数でありシリアライズの対象から除外されます
このように、ストリーム化する際に必要のないものに対しては、 transient で宣言します

揮発性修飾子(volatile)
synchronizedの軽量版w

厳密浮動小数修飾子(strictfp)
strictfpで定義された式内では計算の中間結果の表現もすべて
IEEE 754 規格に定められた数値集合が使用されるそうです
そのため式内の浮動小数点数の動作が変わる可能性があるらしいですw

定数修飾子(const)
現在キーワードのみが定義されており、実際に使用されるケースはないらしい
スポンサードリンク

posted by kenken at 15:33 | Comment(0) | TrackBack(0) | java その他 | このブログの読者になる | 更新情報をチェックする

SQLiteデータベース変更のサンプルプログラム


SQLiteデータベースでデータベースを作成・追加・変更・消去の
サンプルプログラムです
データベースにデータを書き込む
データベースの内容の確認は以下を参照してください
SQLiteのデータベースの保存場所
データベースの確認方法

まずはレイアウトのmain.xmlにボタンを3つ配置します
それぞれinsert用、update用、delete用です
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:orientation="vertical" >

    <Button
    	android:id="@+id/button1"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:text="insert" />

    <Button
    	android:id="@+id/button2"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:text="update" />

    <Button
    	android:id="@+id/button3"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:text="delete" />
    
</LinearLayout>

次にDatabaseHelper.javaを少々変更します
テーブル内容はNo・Name・Tel・Ageと変わりませんが初期値を入力します
初期値もSQLコマンドで入力します
package blog.test;

import android.content.Context;  
import android.database.sqlite.SQLiteDatabase;  
import android.database.sqlite.SQLiteOpenHelper;  
  
  
public class DatabaseHelper extends SQLiteOpenHelper {  
   
    // データベース名   
    private final static String DB_NAME = "blog_testdb";  
    // データベースのバージョン   
    private final static int DB_VER = 1;  
   
    //コンストラクタ  
    public DatabaseHelper(Context context) {  
        super(context, DB_NAME, null, DB_VER);  
    }  
  
    //onCreateメソッド 
    //データベースが作成された時に呼ばれます。
    @Override  
    public void onCreate(SQLiteDatabase db) {  
        String sql = "";  
        sql += "create table MyTable (";  
        sql += " No integer primary key autoincrement";  
        sql += ",Name text not null";  
        sql += ",Tel text";  
        sql += ",Age integer";  
        sql += ")";  
        db.execSQL(sql);  
        
        //初期テーブル作成
        db.execSQL("insert into MyTable(Name,Tel,age) values" +
        		" ('山田',110 ,20);");
        db.execSQL("insert into MyTable(Name,Tel,age) values " +
        		"('田中',119 ,25);");
        db.execSQL("insert into MyTable(Name,Tel,age) values" +
        		" ('佐藤',117, 30);");
    	
    }  
  
    

    /* 
     * onUpgradeメソッド 
     * onUpgrade()メソッドはデータベースをバージョンアップした時に呼ばれる
     */  
    @Override  
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
    
    }  
  
}  

最後ににMainActivity.javaを変更します
やることとしては
・それぞれのボタンにsetOnClickListenerを持たせ押したときのイベントを取得する
・Insert Update deleteをボタンに割り振る
・更新の成否を判定する
の3つです
package blog.test;
 
import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
 
public class MainActivity extends Activity implements OnClickListener {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
		        super.onCreate(savedInstanceState);
		setTitle("MainActivity");
		setContentView(R.layout.main);
		
		//データベースヘルパーのインスタンスを作成する(まだデータベースはできない)  
		DatabaseHelper dbHelper = new DatabaseHelper(this);  
		//データベースオブジェクトを取得する(データベースにアクセスすると作成される。)  
		SQLiteDatabase db = dbHelper.getWritableDatabase();   
		//データベースを閉じる  
		db.close();  
		
		
		/**それぞれのidを設定**/
		Button button1=(Button)findViewById(R.id.button1);
		Button button2=(Button)findViewById(R.id.button2);
		Button button3=(Button)findViewById(R.id.button3);
		/**ボタンが押されたらonClickが動作するよう設定**/
		button1.setOnClickListener(this);
		button2.setOnClickListener(this);
		button3.setOnClickListener(this);
		
	
    }
    
    
    /**ボタンが押された時の処理**/
	public void onClick(View v){
		//ContentValuesを作成して変更するデータを各ボタンで記入する
		ContentValues values = new ContentValues();
		DatabaseHelper dbHelper = new DatabaseHelper(this);
		//データベースを書き込み可能にする
		SQLiteDatabase db = dbHelper.getWritableDatabase();  
		long ret;
		switch(v.getId()){
		case R.id.button1://insertボタン
			values.put("Name", "高橋");  
			values.put("Tel", "999");  
			values.put("Age", 40);  
			try {ret = db.insert("MyTable", null, values);}
			finally {db.close();}//データベースを閉じる
			if (ret == -1) {//insert失敗だとretに-1が返される
				Toast.makeText(this, "Insert失敗", Toast.LENGTH_SHORT).show();  
			} else {   
			    Toast.makeText(this, "Insert成功", Toast.LENGTH_SHORT).show();  
			}  
		      break;
		case R.id.button2://updateボタン
			values.put("Age",50);//Ageを50に変更する
			String whereClause = "No = ?";//検索条件にNoを指定
			String whereArgs[] = new String[1];  
			whereArgs[0] = "1";//Noが1のものをアップデート
			try {ret = db.update("MyTable", values, whereClause, whereArgs);}
			finally {db.close(); }  
			if (ret == -1){  //update失敗だとretに-1が返される
			    Toast.makeText(this, "Update失敗", Toast.LENGTH_SHORT).show();  
			} else {   
			    Toast.makeText(this, "Update成功", Toast.LENGTH_SHORT).show();  
			}  
              break;
          case R.id.button3://deleteボタン
			String whereClause2 = "No = ?"; //検索条件にNoを指定
			String whereArgs2[] = new String[1];  
			whereArgs2[0] = "2";//Noが2のものをDelete
			try {ret = db.delete("MyTable", whereClause2, whereArgs2);}
			finally {db.close(); }  
			if (ret == -1){  //delete失敗だとretに-1が返される
			    Toast.makeText(this, "Delete失敗", Toast.LENGTH_SHORT).show();  
			} else {   
			    Toast.makeText(this, "Delete成功", Toast.LENGTH_SHORT).show();  
			}  
			break;
        }
    }
}

retに戻り値を入力してやり-1だったら更新失敗としています

では実際のデータベースがどのように変化したか見てみます
今回はFirefoxのSQLite Manegerを使用して内容を確認しています

まずは初期値のみのデータベースです
device83.png

次にinsertを押したときのデータベースです
device84.png
No4に高橋が追加してあるのがわかります

次にUpdeteを押したときのデータベースです
device85.png
Noが1の“山田”の“Age”が50にアップデートされているのがわかります

最後にDeleteを押したときのデータベースです
device86.png
Noが2の“田中”がデータベース上から消えているのがわかります

スポンサードリンク

posted by kenken at 11:45 | Comment(0) | TrackBack(0) | データベース SQLite | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。