通讯录-数据库SQLite的存储 数据库语言的模糊查询

工具类:数据库SQLite的创建及增删改查方法的规范MySQLiteOpenHelper

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
	//数据库版本
	private static final int VERSION = 1;
	private SQLiteDatabase sQLiteDatabase = null;
	// 它是数据库名
	private static final String DB_NAME = "contact";
	// 它是数据库的路径
	private static final String DB_PATH = Environment
			.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
			.getAbsolutePath();
	// 它是数据库全路径名
	public  static final String DB = DB_PATH + File.separator + DB_NAME;
	
	
	// 这是封装在内部的,访问数据库的对象
	
	public MySQLiteOpenHelper(Context context) {
		super(context, DB, null, 2);
		// TODO Auto-generated constructor stub
		System.out.println("数据库全路径为 ==="+DB);
		sQLiteDatabase=getWritableDatabase();
	}

	// 它是创建时候的回调
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		Log.i("onCreate", "执行了");
		
		db.execSQL("CREATE TABLE IF NOT EXISTS contact(unit,_id integer PRIMARY KEY AUTOINCREMENT,oid,mobile,name,job,phone,headword,allword);");
	}

	// 这个是版本更新的回调
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		Log.i("onUpgrade", "执行了");
		if(newVersion>oldVersion){
			db.execSQL("DROP TABLE IF EXISTS contact;");
			db.execSQL("CREATE TABLE IF NOT EXISTS contact1(_id integer PRIMARY KEY AUTOINCREMENT,unit,phone,oid,name,job,mobile);");
		}
	}
	// 这是查询数据库的方法们,也就是各种重载
		public Cursor selectCursor(String table, String[] columns,
				String selection, String[] selectionArgs, String groupBy,
				String having, String orderBy) {
			return sQLiteDatabase.query(table, columns, selection, selectionArgs,
					groupBy, having, orderBy);
		}

		public Cursor selectCursor(String sql) {
			return sQLiteDatabase.rawQuery(sql, new String[] {});
		}

		public Cursor selectCursor(String sql, String[] selectionArgs) {
			return sQLiteDatabase.rawQuery(sql, selectionArgs);
		}

		// 这是一个插入的方法,封装了内部访问数据库的insert
		public long insert(String table, String nullColumnHack, ContentValues values) {
			// insert方法第一个参数是表名,第二个参数是防止空行所提供的列名,第三个参数是要插入的字段对应的键值对
			// ContentValues它是一种键值对,可以直接new出来,就像hashmap
			// 返回这一行的行号
			return sQLiteDatabase.insert(table, nullColumnHack, values);
		}

		// 这是一个删除的方法,封装了内部访问数据库的delete
		public long delete(String table, String whereClause, String[] whereArgs) {
			// 第一个参数是表名,第二个参数是条件,第三个参数是替换条件中的占位符
			// 返回值是此次操作影响了多少行
			return sQLiteDatabase.delete(table, whereClause, whereArgs);
		}

		// 这是一个更新的方法,封装了内部访问数据库的update
		public long update(String table, ContentValues values, String whereClause,
				String[] whereArgs) {
			// 第一个参数是表名,第二个参数表示要更新的列,用键值对的方式来表达,第三个参数是条件,第四个参数是替换条件中的占位符
			// 返回值是此次操作影响了多少行
			return sQLiteDatabase.update(table, values, whereClause, whereArgs);
		}

		// 封装一个执行任意语句的方法
		public void execSQL(String sql) {
			sQLiteDatabase.execSQL(sql);
		}

		// 封装一个执行任意语句的方法的重载
		public void execSQL(String sql, Object[] bindArgs) {
			// 第一个参数是任意sql语句,第二个参数是替换占位符,为了兼容数据类型,这里使用了Object数组
			sQLiteDatabase.execSQL(sql, bindArgs);
		}

		// 封装一个cursor转换成list的方法
		public List<Map<String, Object>> cursorToList(Cursor cursor) {
			if (cursor == null) {
				return null;
			}
			List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
			// 获取操作cursor之前的下标
			int position = cursor.getPosition();
			
			cursor.moveToPosition(-1);
			for (; cursor.moveToNext();) {
				Map<String, Object> map = new HashMap<String, Object>();
				// cursor.getColumnCount()方法可以获取到一共有多少个列
				for (int i = 0; i < cursor.getColumnCount(); i++) {
					// cursor.getColumnName(i)可以获取到第i列的列名
					map.put(cursor.getColumnName(i), cursor.getString(i));

				}
				list.add(map);
			}
			// 把cursor恢复到之前的状态
			cursor.moveToPosition(position);
			return list;
		}

		// 查询list的方法们,各种重载就像cursor的查询一样。
		public List<Map<String, Object>> selectList(String table, String[] columns,
				String selection, String[] selectionArgs, String groupBy,
				String having, String orderBy) {
			// 调用之前的查询方法
			Cursor cursor = selectCursor(table, columns, selection, selectionArgs,
					groupBy, having, orderBy);
			// 返回list使用之前的转换方法
			return cursorToList(cursor);
		}

		public List<Map<String, Object>> selectList(String sql,
				String[] selectionArgs) {
			Cursor cursor = selectCursor(sql, selectionArgs);
			return cursorToList(cursor);
		}

		public List<Map<String, Object>> selectList(String sql) {
			Cursor cursor = selectCursor(sql);
			return cursorToList(cursor);
		}

		public void destroy() {
			if (sQLiteDatabase != null) {
				sQLiteDatabase.close();
			}
		}

}
 

数据库的模糊查询:

public class SearchActivity extends Activity implements OnItemClickListener,TextWatcher {
	private ListView listView;
	private ContactAdapter contactAdapter;
	private ArrayList<Contacts> contacts;//联系人列表
	private ArrayList<Person> persons;//打电话用的列表
	private List<Map<String, Object>> list = null;//从数据库中获取的list集合
	private ArrayList<Contacts> list1 = null;//需要加载的数据
	private MySQLiteOpenHelper mySQLiteOpenHelper=null;
	private EditText editText=null;
	private Button bt_cancle;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.search_activity);
		listView = (ListView) findViewById(R.id.lv_contacts_chaxun_item);
		editText = (EditText) findViewById(R.id.et_Search);
		bt_cancle=(Button) findViewById(R.id.bt_search_cancle);
		contactAdapter = new ContactAdapter(SearchActivity.this, contacts);
		listView.setAdapter(contactAdapter);
		listView.setOnItemClickListener(this);
		editText.addTextChangedListener(this);
		mySQLiteOpenHelper = new MySQLiteOpenHelper(SearchActivity.this);
		list1 = new ArrayList<Contacts>();
		list = mySQLiteOpenHelper.selectList("Select * from contact");
		LoadData();	
	}
	//点击取消按钮
	public void Cancle (View view){
		finish();
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view,
			final int position, long id) {
		String str1 = persons.get(position).getPhoto().toString();
		String str2 = persons.get(position).getMobile().toString();
		String[] sq1 = str1.split(",");
		String[] sq2 = str2.split(",");
		String[] sq3 = new String[sq1.length + sq2.length];
		for (int i = 0; i < sq1.length; i++) {
			sq3[i] = sq1[i];
		}
		for (int j = 0; j < sq2.length; j++) {
			sq3[sq1.length + j] = sq2[j];
		}
		String[] sq4 = new String[sq3.length];
		int i = 0;
		int k = 0;
		for (String s : sq3) {
			if (!s.equals("null")) {
				sq4[i] = s;
				i++;
			}
			if (s.equals("null")) {
				k = 1;
			}
		}

		final String[] phoneNum = new String[sq4.length - k];
		for (int m = 0; m < sq4.length - k; m++) {
			phoneNum[m] = sq4[m];

		}

		new AlertDialog.Builder(this).setTitle("拨号列表")
				.setItems(phoneNum, new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {

						// Toast.makeText(this,
						// "您要播的电话是:"+persons.get(which).getPhoto().toString(),
						// Toast.LENGTH_LONG).show();
						Intent intent = new Intent();
						intent.setAction("android.intent.action.CALL");
						intent.addCategory("android.intent.category.DEFAULT");

						intent.setData(Uri.parse("tel:" + phoneNum[which]));

						startActivity(intent);
					}
				}).show();

	}
	
	//从数据库加载所有的数据
	private void LoadData(){
		contacts = new ArrayList<Contacts>();
		persons = new ArrayList<Person>();
		list1.clear();
		for (int i = 0; i < list.size(); i++) {
			Contacts c = new Contacts();
			Person p = new Person();
			c.setName(list.get(i).get("name").toString());
			c.setJob(list.get(i).get("job").toString());
			c.setNumber(list.get(i).get("mobile").toString());
			c.setPhoto(list.get(i).get("phone").toString());
			p.setMobile(list.get(i).get("mobile").toString());
			p.setPhoto(list.get(i).get("phone").toString());
			list1.add(c);
			persons.add(p);
		}
		contactAdapter.setData(list1);
		contactAdapter.notifyDataSetChanged();
	}

	@Override
	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		// TODO Auto-generated method stub
		
		String str = editText.getText().toString().toUpperCase();
		//判断字符串的长度 分别在数据库里检索
		if(str.length()>1){
			list.clear();
			list =mySQLiteOpenHelper.selectList("Select * from contact where (headword like'%"+str+"%')or (phone like'%"+str+"%') or (mobile like'%"+str+"%') or( name like'%"+str+"%') or (allword like'%"+str+"%') ");
		}
		else if (str.length()==1) {
			list.clear();
			list =mySQLiteOpenHelper.selectList("Select * from contact where (headword like'%"+str+"%')or( name like'%"+str+"%')");
		}
		else if(str.length()==0){
			list.clear();
			list = mySQLiteOpenHelper.selectList("Select * from contact");
		}
		LoadData();
	}

	@Override
	public void afterTextChanged(Editable s) {
		// TODO Auto-generated method stub

	}

}

本人原创,转载请注明出处。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值