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";
@Override
public 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);");
}
@Override
public 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.SQLiteCursor
System.out.println(cursor);
//为cursor 设置 通知提醒的URI
cursor.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;
@Override
protected 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);
}
@Override
public 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;
}
@Override
public 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() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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); // 获得群组ID
dbu.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); // 返回群组ID
DBUtils 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以下的系统玩游戏就要小心了哈 暗扣方式之一:短信订购,即监听--------拦截- ...
随机推荐
- 关于图片无法输出的问题使用ob_clean()
前两天相当于炸锅了,用户量在三百万左右,用户一直使用二维码在门店进行消费,晚上八九点钟时 ,居然全都打不开了 原图 出问题的图 本该是二维码的出现不了,代码使用的是PHP的qrcode,蒙圈了,查询了 ...
- linux-kernel-4.4 移植 (2)解决上部遗留DMA-PL330的问题
查看drivers/tty/serial/samsung.c文件发现,当传输数据量小于ourport->min_dma_size时,不使用DMA,大于等于min_mda_size时才是使用DMA ...
- mac环境下mongodb的安装和使用
mac环境下mongodb的安装和使用 简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据 ...
- Unity 角色移动贴墙行走
直接贴上代码,旋转角色角度检测碰撞 Vector2 v2Normal = new Vector2(normal.x, normal.y); float fAngle = Vector2.SignedA ...
- Chapter_3_JAVA作业
第三章 一 .课前预习 1.1 简述概念,什么是类?什么是对象? 类:在Java中是一种重要的复合数据类型,是组成类的基本要素.(把众多的事物规划,划分成一类是人类在认识个观世界时采用的思维方法). ...
- 解决ubuntu 图标消失问题(ubuntu 16)
如题,我的ubuntu 16 在安装了新内核并重启之后,所有的图标都消失了. (可能和新内核没有多大关系,我切回旧内核也那样) 是什么bug我不清楚,但是图标原有的位置还是可以点击的,仔细看图标还在, ...
- HTML元素的分类
HTML元素的分类 EC前端 - HTML教程 块元素 div:无语义,常用于布局 aside:表示article元素的内容之外的与article元素的内容相关内容 figure:表示一段独立的流内容 ...
- eclipse汉化包
把eclipse英文汉化成中文,首先我们要知道自己安装的eclipse版本,可以在eclipse的安装目录下找到readme用浏览器打开查看版本,或者用记事本打开.eclipseproduct文件,查 ...
- 《修炼之道:.NET开发要点精讲》读书笔记(二)
1.简述.NET中CTS.CLS以及CLR的含义与作用. A:CTS指公共类型系统,是.NET平台中各种语言必须遵守的类型规范:CLS指公共语言规范,是.NET平台中各种语言必须遵守的语言规范:CLR ...
- Unity - Photon PUN 本地与网络同步的逻辑分离 (二)
上篇实现了事件系统的设计,这篇就来结合发送RPC消息 并且不用标记 [PunRPC] 先来看下上编的代码 GameEnvent.cs private static Dictionary<Comm ...