7.数据库、Contentobserver



public class MySqliteHelper extends SQLiteOpenHelper{public MySqliteHelper(Context context, String name, int version) {super(context, name, null, version);}public static final String TABLE_GROUPS = "groups";public static final String TABLE_THREAD_GROUPS = "thread_groups";@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table groups(_id integer primary key autoincrement, group_name varchar(20));");db.execSQL("create table thread_groups(_id integer primary key autoincrement, group_id integer, thread_id integer);");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub}}
public class DBUtils {/*** 用于更新cursor 的URI*/private static final Uri uri = Uri.parse("content://www.itheima.com");private Context ctx;private MySqliteHelper sqlHelper;private DBUtils(Context ctx){this.ctx = ctx;sqlHelper = new MySqliteHelper(ctx, "heima39", 1);}private static DBUtils instance;public static synchronized DBUtils getInstance(Context ctx){if(instance == null){instance = new DBUtils(ctx);}return instance;}/*** 创建新群组* @param name 群组的名称*/public void createNewGroup(String name) {SQLiteDatabase db = sqlHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("group_name", name);db.insert(MySqliteHelper.TABLE_GROUPS, "_id", values);notifyCursor();}/*** 查询所有的群组信息* @return*/public Cursor getAllGroup() {SQLiteDatabase db = sqlHelper.getReadableDatabase();Cursor cursor = db.query(MySqliteHelper.TABLE_GROUPS, null, null, null, null, null, null);// android.database.sqlite.SQLiteCursorSystem.out.println(cursor);//为cursor 设置 通知提醒的URIcursor.setNotificationUri(ctx.getContentResolver(), uri);return cursor;}/*** 通知cursor 群组表中的内容已经发生变化* @param cursor*/private void notifyCursor() {// 让内容处理者,根据URI 发出更新通知ctx.getContentResolver().notifyChange(uri, null);}/*** 通过群组ID删除群组* @param groupId*/public void deleteGroupById(int groupId) {SQLiteDatabase db = sqlHelper.getWritableDatabase();db.delete(MySqliteHelper.TABLE_GROUPS, " _id = "+groupId, null);notifyCursor();}/*** 更新群组名称* @param groupId 群组的ID* @param name 群组的新名*/public void updateGroupById(int groupId, String name) {SQLiteDatabase db = sqlHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("group_name", name);db.update(MySqliteHelper.TABLE_GROUPS, values, " _id = "+groupId , null);notifyCursor();}/*** 将会话ID和群组ID 插入到会话群组关系 表中* @param threadId* @param groupId*/public void insertThradIdAndGroupId(int threadId, int groupId) {SQLiteDatabase db = sqlHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("thread_id", threadId);values.put("group_id", groupId);db.insert(MySqliteHelper.TABLE_THREAD_GROUPS,null, values);}/*** 返回所有的指定群组ID的会话信息* @param groupId* @return*/public Cursor getAllThreadIdByGroupId(int groupId) {SQLiteDatabase db = sqlHelper.getReadableDatabase();Cursor cursor = db.query(MySqliteHelper.TABLE_THREAD_GROUPS, null, " group_id = "+groupId, null, null, null, null);return cursor;}}

public class GroupUI extends ListActivity implements OnItemLongClickListener, OnItemClickListener{private ListView listView;private Context ctx;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ctx = this;listView = getListView();adapter = new GropListAdapter(this, null);listView.setAdapter(adapter);listView.setOnItemLongClickListener(this);listView.setOnItemClickListener(this);prepareData();}private void prepareData() {DBUtils dbu = DBUtils.getInstance(ctx);Cursor cursor = dbu.getAllGroup();adapter.changeCursor(cursor);}private GropListAdapter adapter;class GropListAdapter extends CursorAdapter{public GropListAdapter(Context context, Cursor c) {super(context, c);}@Overridepublic View newView(Context context, Cursor cursor, ViewGroup parent) {View view = View.inflate(context, R.layout.list_item_group, null);TextView name = (TextView) view.findViewById(R.id.tv_name_group);view.setTag(name);return view;}@Overridepublic void bindView(View view, Context context, Cursor cursor) {TextView name = (TextView) view.getTag();name.setText(cursor.getString(cursor.getColumnIndex("group_name")));}}@Override/*** 创建菜单*/public boolean onCreateOptionsMenu(Menu menu) {// 将 资料ID对应的文件转换为 菜单条目 ,并添加至 menu 中getMenuInflater().inflate(R.menu.activity_group, menu);return true;}@Override/*** 响应菜单的点击事件*/public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.menu_new_group:showCreateGroupDialog();break;}return true;}private AlertDialog dialog;/*** 显示新建群组对话框*/private void showCreateGroupDialog() {AlertDialog.Builder adb =new AlertDialog.Builder(ctx);dialog = adb.create();View view = View.inflate(ctx, R.layout.dialog_new_group, null);final EditText etInputName = (EditText) view.findViewById(R.id.et_input_new_group);Button btnOk = (Button) view.findViewById(R.id.btn_ok);btnOk.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String name = etInputName.getText().toString();if(TextUtils.isEmpty(name)){Toast.makeText(ctx, "请输入群组名称", 0).show();return ;}// 将群组名称保存至数据库DBUtils dbu = DBUtils.getInstance(ctx);dbu.createNewGroup(name);dialog.dismiss();}});dialog.setView(view,0,0,0,0);dialog.show();}@Override/*** 响应listview条目的长按事件*/public boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {showEditGroupDialog(position);return true;}/*** 显示编辑群组对话框* @param position*/private void showEditGroupDialog(final int position) {AlertDialog.Builder adb = new AlertDialog.Builder(ctx);String items[]=new String[]{"编辑","删除"};adb.setItems(items, new DialogInterface.OnClickListener() {@Override/*** which 是点击的条目的位置*/public void onClick(DialogInterface dialog, int which) {if(which == 0){ // “编辑”showUpdateGroupDialog(position);}else{ // 删除showConfirmDeleteDialog(position);}}});adb.show();}/*** 显示确认删除的对话框* @param position*/protected void showConfirmDeleteDialog(final int position) {AlertDialog.Builder adb = new AlertDialog.Builder(ctx);adb.setTitle("删除群组");adb.setMessage("确定要删除这个群吗?");adb.setNegativeButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 删除对应的群组DBUtils dbu = DBUtils.getInstance(ctx);Cursor cursor = adapter.getCursor();cursor.moveToPosition(position);int groupId = cursor.getInt(0); // 获得第0列的值,即,_id 这一列的值dbu.deleteGroupById(groupId);dialog.dismiss();}});adb.setPositiveButton("取消", null);adb.show();}/*** 显示更新群组的对话框* @param position*/protected void showUpdateGroupDialog(final int position) {AlertDialog.Builder adb =new AlertDialog.Builder(ctx);dialog = adb.create();View view = View.inflate(ctx, R.layout.dialog_new_group, null);TextView title = (TextView) view.findViewById(R.id.tv_title_dialog);title.setText("更新群组名称");final EditText etInputName = (EditText) view.findViewById(R.id.et_input_new_group);Button btnOk = (Button) view.findViewById(R.id.btn_ok);btnOk.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String name = etInputName.getText().toString();if(TextUtils.isEmpty(name)){Toast.makeText(ctx, "请输入群组名称", 0).show();return ;}// 将群组名称保存至数据库DBUtils dbu = DBUtils.getInstance(ctx);Cursor cursor = adapter.getCursor();cursor.moveToPosition(position);int groupId = cursor.getInt(0); // 获得群组IDdbu.updateGroupById(groupId,name);dialog.dismiss();}});dialog.setView(view,0,0,0,0);dialog.show();}@Override/*** 响应listview条目点击事件*/public void onItemClick(AdapterView<?> parent, View view, int position,long id) {Cursor cursor = adapter.getCursor();cursor.moveToPosition(position);int groupId = cursor.getInt(0); // 返回群组IDDBUtils dbu =DBUtils.getInstance(ctx);Cursor cursor2 = dbu.getAllThreadIdByGroupId(groupId);if(cursor2.getCount() == 0){ // 该群组没有人Toast.makeText(ctx, "该群还没有人,快回点人气吧", 0).show();}else{// 如果有人的话,希望能过cursor2 拼凑出如: thread_id in (1,2);String subSql = convertCursor2Str(cursor2);System.out.println("subSql"+subSql);Intent intent = new Intent(this,ConversationUI.class);intent.putExtra("subSql", subSql);startActivity(intent);}}/*** 根据cursor中的内容,拼凑出 如 thread_id in (1,2); 的字符串* @param cursor2* @return*/private String convertCursor2Str(Cursor cursor) {cursor.moveToPosition(-1);StringBuilder sb=new StringBuilder(" thread_id in ( ");while(cursor.moveToNext()){String threadId = cursor.getString(cursor.getColumnIndex("thread_id"));sb.append(threadId+","); // thread_id in (1,}// thread_id in (1,2,3,4,sb.replace(sb.lastIndexOf(","), sb.length(), ")");return sb.toString();}}
7.数据库、Contentobserver的更多相关文章
- JSP应用开发 -------- 电纸书(未完待续)
http://www.educity.cn/jiaocheng/j9415.html JSP程序员常用的技术 第1章 JSP及其相关技术导航 [本章专家知识导学] JSP是一种编程语言,也是一种动 ...
- 内容观察者 ContentObserver 监听短信、通话记录数据库 挂断来电
Activity public class MainActivity extends ListActivity { private TextView tv_info; private ...
- 数据库技术中的触发器(Trigger)——和ContentObserver功能类似
刚总结过ContentObserver的作用和特点,顺便总结下数据库技术中的触发器(Trigger),触 发 器 分 为 表 触 发 器 . 行 触 发 器
- ContentObserver监听数据库·变化
//短信Uri Uri smsUri = Uri.parse("content://sms"); //使用ContentReslover注册·监听器 getContentResol ...
- Android监听系统短信数据库变化-提取短信内容
由于监听系统短信广播受到权限的限制,所以很多手机可能使用这种方式没法监听广播,从而没办法获取到系统短信,所以又重新开辟一条路. Android监听系统短信数据库内容变化使用场景: 1.监听短信数据库的 ...
- android ContentObserver
android 设置飞行模式 : 长按关机键 3 秒. 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解 ...
- 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)
1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...
- 基础学习总结(六)--getContentRolver()的应用、内容监听者ContentObserver
ContentResolver / getContentResolver() 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当 ...
- Android 监听短信(同时监听广播和数据库)
暗扣,强烈谴责这种侵害用户利益的行为... 下面给大家介绍Android暗扣原理....... Android4.4以下的系统玩游戏就要小心了哈 暗扣方式之一:短信订购,即监听--------拦截- ...
随机推荐
- 查找linux下进程占用CPU过高的原因,以php-fpm为例
很多时候,线上服务器的进程在某时间段内长时间占用CPU过高,为了优化,我们需要找出原因. 1.找出占用CPU最高的10个进程 ps aux | sort -k3nr | head -n 10 或查看占 ...
- anaconda使用方法
我是用的win10.想写爬虫,所以使用了 anaconda .总结一下使用的方法. 安装阶段跳过.: 再终端输入 jupyter notebook 然后就会在. 浏览器显示一个网页.其实这个也不 ...
- Memcached和Memcache安装(64位win7)[z]
http://www.cnblogs.com/lucky-man/p/6126667.html 一.Memcached和Memcache的区别: 网上关于Memcached和Memcache的区别的理 ...
- linux下ping命令出现ping: sendto: Network is unreachable
问题:ping外网出现: sendto: Network is unreachable 查看: #route Route命令 : 在数据包没有有效传递的情况下,可以利用route命令查看路由表 [ro ...
- kubernetes + istio进行流量管理
实验目的: 本文介绍如何通过istio实现域名访问k8s部署的nginx服务 前提: 已经安装了kubernetes的服务器 了解 kubernetes 基本命令如何使用 (kubectl creat ...
- echarts 图表重新加载,原来的数据依然存在图表上
问题 在做一个全国地图上一些饼图,并且向省一级的地图钻取的时候,原来的饼图依然显示 原因 echars所有添加的图表都在一个series属性集合中,并且同一个echars对象默认是合并之前的数据的,所 ...
- 每天写两个的java常见面试题—final 和static 的用法
第一次写随笔,可能写的比较乱,更多的是作为自己记忆一些知识的方式.所有记录的东西都是自己的一些理解,很多语言可能还是从其他大牛的博客里面搬过来的. 一.static的作用: static的的作用从三个 ...
- Visual Studio连接Oracle数据库
一.安装Oracle Developer Tools for Visual Studio 2015 其他的什么client一概不要装,装了的直接卸载. 下载时需要登录,如果之前已经注册账号,提醒一下密 ...
- Python 的 14 张思维导图汇总
本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库,后续会发布相应专题的文章). 首先,按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典 ...
- CSS定位网页中的元素
relative相对定位 偏移设置:left.right.top.bottom 值单位:px 元素的规律: 相对定位元素的规律 设置相对定位的盒子会相对它原来的位置通过指定偏移,到达新的位置. 设置相 ...