Androidプラットフォームはsqliteを使用します.

7865 ワード

sqliteはプラットフォームをまたぐ小型データベースとしてもいいです.Androidで使うのは他のプラットフォームと同じです.
AndroidはSQLiteOpenHelperを提供しています.直接SQLiteDatabaseを使ってもsqliteデータベースを操作できます.
J 2 eeの中では、簡単に習慣的にjdbcの操作データベースを包装しますので、ここではSQLiteOpenHelper類を使って簡単にsqliteを包装します.
package com.example.org.suju.work9;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class MySQliteHandler extends SQLiteOpenHelper {

	private final static int VERSION = 1;
	private SQLiteDatabase db;
	
	public MySQliteHandler(Context context, String name, CursorFactory factory) {
		super(context, name, factory, VERSION);
	}
	
	public MySQliteHandler(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
	}
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		System.out.println("debug:create db");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		System.out.println("debug:upgrade");
	}
	
	/*
	 * @param    name   javabean        
	 * @return     getXXX        
	 */
	private String getMethodName(String name)
	{
		StringBuilder sb = new StringBuilder(name);
		//        
		char first = sb.charAt(0);
		sb.setCharAt(0, Character.toUpperCase(first));
		sb.insert(0, "get");
		return sb.toString();
	}
	
	/*
	 *       
	 * @param    name   javabean        
	 * @return     getXXX        
	 */
	private String setMethodName(String name)
	{
		StringBuilder sb = new StringBuilder(name);
		//        
		char first = sb.charAt(0);
		sb.setCharAt(0, Character.toUpperCase(first));
		sb.insert(0, "set");
		return sb.toString();
	}
	
	/*
	 *            ContentValues put  
	 */
	private ContentValues contentPutValue(ContentValues cv, String key, Object value) throws Exception
	{
		Method method = ContentValues.class.getMethod("put", String.class, value.getClass());
		method.invoke(cv, key, value);
		return cv;
	}
	
	public void insert(String table, Object obj)
	{
		db = getWritableDatabase();
		Class<?> cls = obj.getClass();
		Field[] fields = cls.getDeclaredFields();
		ContentValues cv = new ContentValues();
		
		for (Field f: fields) {
			String mname = getMethodName(f.getName());
			try {
				//  bean  getXxx     
				Method method = cls.getMethod(mname);
				cv = contentPutValue(cv, f.getName(), method.invoke(obj));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		db.insert(table, null, cv);
	}
	
	/** 
	 *     map
	 * @param table
	 * @param obj
	 */
	public void insert(String table, Map<String, Object> obj)
	{
		db = getWritableDatabase();
		ContentValues cv = new ContentValues();
		
		for (String key: obj.keySet()) {
			cv.put(key, obj.get(key).toString());
		}
		db.insert(table, null, cv);
	}
	
	/*
	 *   set    bean     
	 *       
	 */
	private <T> T setObjValue(T obj , Cursor cursor) throws Exception
	{
		int index;
		String mname = null;		//   
		Method method = null;		//  set  
		String[] cns = cursor.getColumnNames();
		for (String cname: cns) {
			index = cursor.getColumnIndex(cname);
			mname = setMethodName(cname);
			int type = cursor.getType(index);
			
			switch (type) {
				case Cursor.FIELD_TYPE_FLOAT:
					//           
					method  = obj.getClass().getMethod(mname, float.class);
					method.invoke(obj, cursor.getFloat(index));
					break;
				case Cursor.FIELD_TYPE_BLOB:
					method  = obj.getClass().getMethod(mname, byte[].class);
					method.invoke(obj, cursor.getBlob(index));
					break;
				case Cursor.FIELD_TYPE_INTEGER:
					method  = obj.getClass().getMethod(mname, int.class);
					method.invoke(obj, cursor.getInt(index));
					break;
				case Cursor.FIELD_TYPE_STRING:
					method  = obj.getClass().getMethod(mname, String.class);
					method.invoke(obj, cursor.getString(index));
					break;
				default:
					break;
			}
		}
		return obj;
	}
	
	/*
	 *      list,          
	 */
	public <T> List<T> query(String table, Class<T> cls, String... select)
	{
		StringBuilder query = new StringBuilder("select * from ");
		query.append(table);
		
		List<T> result = new ArrayList<T>();
		db = getReadableDatabase();
		try {
			//       , bean            
			T obj = cls.newInstance();
			//            
			Cursor cursor = db.rawQuery(query.toString(), select);
			while (cursor.moveToNext()) {
				//  set    obj    
				obj = setObjValue(obj, cursor);
				result.add(obj);
			}
		} catch (Exception e) {
			System.out.println("debug:" + e);
		}
		return result;
	}
	
	/*
	 *     
	 *     obj           
	 */
	public void update(String table, Object obj, String where, String[] select,  String... fields)
	{
		db = getWritableDatabase();
		Class<?> cls = obj.getClass();
		ContentValues cv = new ContentValues();
		
		//          
		for (String f: fields) {
			String mname = getMethodName(f);
			try {
				Method method = cls.getMethod(mname);
				cv = contentPutValue(cv, f, method.invoke(obj));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		db.update(table, cv, where, select);
	}
	
	public void execSQL(String sql)
	{
		db = getWritableDatabase();
		db.execSQL(sql);
	}
	
}
簡単なUserオブジェクトで、いくつかのフィールドがあります.
private String name;
private int age;
private int id;
private String countries;
Activityコード:
4つのボタンをレイアウトしただけで、データベースを初期化して、挿入して、更新して、デモ、異常を検出して捕獲していません.
public class MainActivity extends Activity {

	private Button create;
	private Button update;
	private Button query;
	private Button insert;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		create = (Button) findViewById(R.id.create);
		update = (Button) findViewById(R.id.update);
		insert = (Button) findViewById(R.id.insert);
		query = (Button) findViewById(R.id.query);
		
		create.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				MySQliteHandler msh = new MySQliteHandler(MainActivity.this, "sqlitdemo", null, 1);
				msh.execSQL("create table user(id integer, name text, age integer, countries text);");
			}
		});
		
		update.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				MySQliteHandler msh = new MySQliteHandler(MainActivity.this, "sqlitdemo", null, 1);
				System.out.println("debug:update");
				User tom = new User("linux", 19, 2, "englist");
				msh.update("user", tom, "id=?", new String[]{"2"} , new String[]{"name", "countries"});
			}
		});
		
		insert.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				MySQliteHandler msh = new MySQliteHandler(MainActivity.this, "sqlitdemo", null, 1);
				System.out.println("debug:insert");
				User tom = new User("tomcat", 19, 2, "china");
				msh.insert("user", tom);
			}
		});
		
		query.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				MySQliteHandler msh = new MySQliteHandler(MainActivity.this, "sqlitdemo", null, 1);
				List<User> list = msh.query("user", User.class);
				User tom = list.get(0);
				System.out.println("debug:query" + tom);
				Toast.makeText(MainActivity.this, tom.toString(), 1000).show();
			}
		});
	}