现在的位置: 首页 > 综合 > 正文

day13 数据库的思想

2017年10月12日 ⁄ 综合 ⁄ 共 9399字 ⁄ 字号 评论关闭

  对于安卓我一直认为,用java 去思考安卓内所有东西,用设计模式去解释,各种架构,而不是去记住每个方法有啥用的。  

数据库-database  本身就是一个操作类(增删改差),而需要一个help类去协助一起解决 而help又是一个抽象类,里面封装了很多方法,其中就有 Oncreate Onupdate 两个重要的方法,这也算是MVC模式么,不像, java 就是这么一个死德性,封装性高,每个类 都有自己的功能,高聚合低耦合。  其实也算是database 一个助理的存在。 

好啦 我还要用一个Demo来 证明思想的


package com.example.sqlitesave;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DBhelper extends SQLiteOpenHelper {
	private static final String DB_NAME = "school";
	private static final int VERSION = 1;
	public static final String TABLE_NAME = "stu";
	public static final String S_ID = "id";
	public static final String S_NAME = "name";
	public static final String S_SEX = "sex";
	public static final String S_AGE = "age";

	public DBhelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
	}
	public DBhelper(Context context){
		this(context, DB_NAME, null, VERSION);
	}
	public DBhelper(Context context,int version){
		this(context, DB_NAME, null, version);
	}
	//第一次创建数据库表的时候会调用:创建表
	@Override
	public void onCreate(SQLiteDatabase db) {
		//create table 表名(列名 列类型,列名 列类型....)
		String createTable="create table " + TABLE_NAME + " ( " + S_ID
				+ " INTEGER PRIMARY KEY autoincrement , " + S_NAME
				+ " NVARCHAR(10) , " + S_SEX + " NVARCHAR(2) , "+S_AGE+" int )";
		db.execSQL(createTable);
	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
		
	}

}

 help类中没什么多说的,主要是 用全局变量来代理变量减少错误,其实完全可以封装成一个方法,在database中直接传值。

我先说说demo的思想  先用伪代码。

1.页面是一个listview 是来装数据 一个button是用来控制增加数据 

2.listview应该条目的短击是删除,长按是修改, 进入界面应该先查询数据。

3.核心思想就是围绕着一个button的点击事件, 查询数据是应该用 contentvalue 来封装,查询出来的数据应该用集合来填充。

所以

第一步,初始化 所有组件 并给button添加各种点击事件,并在Oncreate中查询所有数据 填充起来,适配器因为数据所以只有一行 就应该用系统再带的simplelist。

先说 获取表数据,首先要在help类中定义好,查询语句 关于数据检索的话 就会牵扯到Curce  curce是一个接口  专门用于检索数据库的数据, 还能随机读写访问。非她莫属了,因为检索出来的是键值对,所以要用hashmap 来填充 

然后通过列名获取列索引-->通过索引获取列上的值

DbHelp.S_ID ID在help类里面 定义了全局变量 所以直接获取  通过列名获取索引 --》cursor.getColumnIndex(DBhelper.S_ID) 通过列索引获取到列上的值 
String id = cursor.getInt(cursor.getColumnIndex(DBhelper.S_ID))
+ "";

然后用simpleadapter 讲map put好的数据 进行填充

simpleadapter  有四个属性 第一个 填充的acitivity  第二个 填充的数据源, 第三个 要填充的布局 第四个 数据源从哪里来的  第五个 到哪里去

	/** 获取表数据 */
	private void getTableData() {
		data.clear();
		DBhelper dBhelper = new DBhelper(MainActivity.this);
		SQLiteDatabase db = dBhelper.getReadableDatabase();
		// 参数1表名 参数2要查询列 参数3查询条件“id=? and name=?” 参数4参数3中占位符的值 参数5分组条件 参数6组合条件
		// 参数7排序
		Cursor cursor = db.query(DBhelper.TABLE_NAME, null, null, null, null,
				null, null);// 查出表中所有的数据
		HashMap<String, String> hashMap;
		while (cursor.moveToNext()) {
			hashMap = new HashMap<String, String>();
			// 通过列索引获取到列上的值;;;通过列名获取列索引;;;
			// 获取id
			String id = cursor.getInt(cursor.getColumnIndex(DBhelper.S_ID))
					+ "";
			hashMap.put("id", id);
			// 获取name
			String name = cursor.getString(cursor
					.getColumnIndex(DBhelper.S_NAME));
			hashMap.put("name", name);
			// 获取性别
			String sex = cursor
					.getString(cursor.getColumnIndex(DBhelper.S_SEX));
			hashMap.put("sex", sex);
			// 获取年龄
			int age = cursor.getInt(cursor.getColumnIndex(DBhelper.S_AGE));
			hashMap.put("age", age + "");
			// 添加到数据集
			data.add(hashMap);
		}
		SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, data,
				android.R.layout.simple_list_item_2, new String[] { "name",
						"age" }, new int[] { android.R.id.text1,
						android.R.id.text2 });
		lv.setAdapter(adapter);
	}

第二步  也就单击 删除数据 首先要从点击发生的view中取到adapter 中的 item的值 然后再取值到ID  进行删除操作  刷新数据

		//单击操作:数据删除
				lv.setOnItemClickListener(new OnItemClickListener() {

					@Override
					public void onItemClick(AdapterView<?> parent, View view,
							int position, long id) {
						//数据库帮助类
						DBhelper dBhelper = new DBhelper(MainActivity.this);
						//可写入的数据库对象
						SQLiteDatabase writableDatabase = dBhelper.getWritableDatabase();
						//当前点中的item的数据
						curClickHm = (HashMap<String, String>) parent.getAdapter()
								.getItem(position);
						//删除数据
						writableDatabase.delete(DBhelper.TABLE_NAME, "id=?", new String[]{curClickHm.get("id")});
						getTableData();//刷新ListView数据
						Toast.makeText(MainActivity.this, curClickHm.get("id")+"被删除了", 1000).show();
					}
				});


	}

主要代码

package com.example.sqlitesave;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends Activity {
	List<HashMap<String, String>> data;
	HashMap<String, String> curClickHm;
	private Button btn;
	private ListView lv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		data = new ArrayList<HashMap<String, String>>();
		btn = (Button) findViewById(R.id.btnInsert);
		lv = (ListView) findViewById(R.id.lv_tableData);
		getTableData();
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				btnClickInsert();
			}
		});

		lv.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				Toast.makeText(MainActivity.this, "短按~~~", 1000).show();
			}
		});
		// c长按修改数据
		lv.setOnItemLongClickListener(new OnItemLongClickListener() {

			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View view,
					int position, long id) {
				curClickHm = (HashMap<String, String>) parent.getAdapter()
						.getItem(position);
				updateData();
				Toast.makeText(MainActivity.this, curClickHm.get("id"), 1000)
						.show();
				return true;
			}
		});
		//单击操作:数据删除
				lv.setOnItemClickListener(new OnItemClickListener() {

					@Override
					public void onItemClick(AdapterView<?> parent, View view,
							int position, long id) {
						//数据库帮助类
						DBhelper dBhelper = new DBhelper(MainActivity.this);
						//可写入的数据库对象
						SQLiteDatabase writableDatabase = dBhelper.getWritableDatabase();
						//当前点中的item的数据
						curClickHm = (HashMap<String, String>) parent.getAdapter()
								.getItem(position);
						//删除数据
						writableDatabase.delete(DBhelper.TABLE_NAME, "id=?", new String[]{curClickHm.get("id")});
						getTableData();//刷新ListView数据
						Toast.makeText(MainActivity.this, curClickHm.get("id")+"被删除了", 1000).show();
					}
				});


	}
         
	/** 修改数据 */
	private void updateData() {
		// DBhelper dBhelper = new DBhelper(MainActivity.this);
		// SQLiteDatabase db = dBhelper.getWritableDatabase();
		AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
		builder.setTitle("修改数据");
		// 把布局转换视图
		View view = View.inflate(MainActivity.this, R.layout.dialog, null);
		builder.setView(view);
		final EditText etxt_name;
		final EditText etxt_sex;
		final EditText etxt_age;
		etxt_name = (EditText) view.findViewById(R.id.etxt_name);
		etxt_sex = (EditText) view.findViewById(R.id.etxt_sex);
		etxt_age = (EditText) view.findViewById(R.id.etxt_age);

		// 添加按钮
		builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				String name = etxt_name.getText().toString();
				String sex = etxt_sex.getText().toString();
				String age = etxt_age.getText().toString();

				DBhelper dBhelper = new DBhelper(MainActivity.this);
				SQLiteDatabase db = dBhelper.getWritableDatabase();
				// 如果编辑框输入内容不为空,则更新到数据库中
				if (!isTextOK(name)) {
					ContentValues contentValues = new ContentValues();
					contentValues.put(DBhelper.S_NAME, name);
					db.update(DBhelper.TABLE_NAME, contentValues, "id=?",
							new String[] { curClickHm.get("id") });
				}
				// 重新查询数据库
				getTableData();

			}
		});
		builder.show();

	}

	private void btnClickInsert() {
		AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
		builder.setTitle("添加数据");
		// 把布局转换视图
		View view = View.inflate(MainActivity.this, R.layout.dialog, null);
		builder.setView(view);

		final EditText etxt_name;
		final EditText etxt_sex;
		final EditText etxt_age;
		etxt_name = (EditText) view.findViewById(R.id.etxt_name);
		etxt_sex = (EditText) view.findViewById(R.id.etxt_sex);
		etxt_age = (EditText) view.findViewById(R.id.etxt_age);

		// 添加按钮
		builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				String name = etxt_name.getText().toString();
				String sex = etxt_sex.getText().toString();
				String age = etxt_age.getText().toString();
				if (!isTextOK(name) && !isTextOK(sex) && !isTextOK(age)) {
					DBhelper dBhelper = new DBhelper(MainActivity.this);
					SQLiteDatabase db = dBhelper.getWritableDatabase();

					ContentValues contentValues = new ContentValues();
					contentValues.put(DBhelper.S_NAME, name);
					contentValues.put(DBhelper.S_SEX, sex);
					contentValues.put(DBhelper.S_AGE, Integer.parseInt(age));
					db.insert(DBhelper.TABLE_NAME, null, contentValues);
					getTableData();
				}

			}
		});
		builder.setNegativeButton("取消", null);
		builder.show();

	}

	private boolean isTextOK(String str) {
		return TextUtils.isEmpty(str);
	}

	/** 获取表数据 */
	private void getTableData() {
		data.clear();
		DBhelper dBhelper = new DBhelper(MainActivity.this);
		SQLiteDatabase db = dBhelper.getReadableDatabase();
		// 参数1表名 参数2要查询列 参数3查询条件“id=? and name=?” 参数4参数3中占位符的值 参数5分组条件 参数6组合条件
		// 参数7排序
		Cursor cursor = db.query(DBhelper.TABLE_NAME, null, null, null, null,
				null, null);// 查出表中所有的数据
		HashMap<String, String> hashMap;
		while (cursor.moveToNext()) {
			hashMap = new HashMap<String, String>();
			// 通过列索引获取到列上的值;;;通过列名获取列索引;;;
			// 获取id
			String id = cursor.getInt(cursor.getColumnIndex(DBhelper.S_ID))
					+ "";
			hashMap.put("id", id);
			// 获取name
			String name = cursor.getString(cursor
					.getColumnIndex(DBhelper.S_NAME));
			hashMap.put("name", name);
			// 获取性别
			String sex = cursor
					.getString(cursor.getColumnIndex(DBhelper.S_SEX));
			hashMap.put("sex", sex);
			// 获取年龄
			int age = cursor.getInt(cursor.getColumnIndex(DBhelper.S_AGE));
			hashMap.put("age", age + "");
			// 添加到数据集
			data.add(hashMap);
		}
		SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, data,
				android.R.layout.simple_list_item_2, new String[] { "name",
						"age" }, new int[] { android.R.id.text1,
						android.R.id.text2 });
		lv.setAdapter(adapter);
	}

}

好啦 有点累,休息休息

抱歉!评论已关闭.