Android——黑名单管理

DBHelper.java
package com.example.chenshuai.test; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; /**
* Created by chenshuai on 2016/4/15.
*/
public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context) {
super(context, "blacklist.db", null, 1);
} @Override
public void onCreate(SQLiteDatabase db) { db.execSQL("create table black_number (_id integer primary key autoincrement,phone_number varchar)"); Log.e("TAG","建表完成" );
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}
BlackNumber.java
package com.example.chenshuai.test; /**
* Created by chenshuai on 2016/4/15.
*/
//实体类 只负责装载数据
public class BlackNumber { private long id;
private String phoneNumber; //生成get和set方法 public long getId() {
return id;
} public void setId(long id) {
this.id = id;
} public String getPhoneNumber() {
return phoneNumber;
} public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
} //构造方法
public BlackNumber() {
} public BlackNumber(long id, String phoneNumber) {
this.id = id;
this.phoneNumber = phoneNumber;
} public BlackNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
} @Override
public String toString() {
return "BlackNumber{" +
"id=" + id +
", phoneNumber='" + phoneNumber + '\'' +
'}';
}
}
BlackNumberDAO.java
package com.example.chenshuai.test; import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log; import java.util.ArrayList;
import java.util.List; /**
* Created by chenshuai on 2016/4/15.
*/
//数据操作类
public class BlackNumberDAO { private DBHelper dbHelper;
//构造方法 初始化
public BlackNumberDAO(Context context){ //初始化工具类
dbHelper = new DBHelper(context);
} //增 直接将实体类传进来
public void insert(BlackNumber blackNumber)
{
//获取数据库连接
SQLiteDatabase sd = dbHelper.getWritableDatabase(); //要添加数据的键值对集合
ContentValues contentValues = new ContentValues();
contentValues.put("phone_number", blackNumber.getPhoneNumber()); //数据添加
sd.insert("black_number", null, contentValues); //关闭数据库
sd.close(); Log.e("TAG", "添加数据成功");
} //查询
//用List<实体类的实例>返回数据
public List<BlackNumber> getAll()
{
//List 接口 ArrayList 实现类
List<BlackNumber> rtn = new ArrayList<BlackNumber>(); //查询数据
//获取数据库连接
SQLiteDatabase sd = dbHelper.getWritableDatabase(); //返回游标
Cursor cursor = sd.query("black_number", null, null, null, null, null, "_id desc"); //遍历 移动游标,获取数据
while(cursor.moveToNext())
{
//构造实体类的实例,放入List
rtn.add(new BlackNumber(cursor.getLong(0),cursor.getString(1)));
}
Log.e("TAG", "数据的记录条数" + cursor.getCount()); sd.close(); return rtn;
} //修改
public void update(BlackNumber blackNumber)
{
//获取数据库连接
SQLiteDatabase sd = dbHelper.getWritableDatabase(); //要添加数据的键值对集合
ContentValues contentValues = new ContentValues();
contentValues.put("phone_number", blackNumber.getPhoneNumber()); //数据修改
sd.update("black_number",contentValues,"_id=?",new String[]{String.valueOf(blackNumber.getId())});
//sd.update("black_number",contentValues,"_id=?",new String[]{blackNumber.getId().toString()}); //关闭数据库
sd.close(); Log.e("TAG", "添加数据成功"); }
//删 传主键
public void delete(long id)
{
//获取数据库连接
SQLiteDatabase sd = dbHelper.getWritableDatabase(); //数据删除
sd.delete("black_number","_id=?",new String[]{String.valueOf(id)}); //关闭数据库
sd.close(); Log.e("TAG", "删除数据成功"); } }
activity_activityhhh1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.chenshuai.test.Activityhhh1"
android:orientation="vertical"> <ListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@android:id/list">
</ListView> <TextView
android:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="还没有一个黑名单"
android:textSize="30dp"
android:gravity="center"/> <Button
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="添加"
android:onClick="bt_tianjiasjonclick"/> </LinearLayout>
Activityhhh1.java
package com.example.chenshuai.test; import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.InputType;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; import java.util.List; public class Activityhhh1 extends ListActivity { private ListView lv_1;
private List<BlackNumber> data;
private BlackListAdapter bla;
private int position;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activityhhh1); //lv_1 = (ListView)findViewById(R.id.lv_1);
lv_1 = getListView(); //获取数据集合
BlackNumberDAO bn = new BlackNumberDAO(this); data = bn.getAll(); //设置适配器
bla = new BlackListAdapter();
lv_1.setAdapter(bla);
//设置上下文菜单
lv_1.setOnCreateContextMenuListener(this);
} //创建上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo);
//添加两个item
menu.add(0,0,0,"修改");
menu.add(0,1,1,"删除"); //获取长按的适配器信息
AdapterView.AdapterContextMenuInfo mninfo = (AdapterView.AdapterContextMenuInfo)menuInfo; position = mninfo.position;
} //加选项监听
@Override
public boolean onContextItemSelected(MenuItem item) {
final BlackNumber bt = data.get(position);
switch (item.getItemId())
{
//修改
case 0:
//弹出对话框
//定义文本框 final EditText et = new EditText(this);
et.setInputType(InputType.TYPE_CLASS_PHONE);
et.setText(bt.getPhoneNumber()); new AlertDialog.Builder(this)
.setTitle("修改黑名单")
.setView(et)
.setNeutralButton("取消",null)
.setPositiveButton("修改", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { //获取修改后的值
bt.setPhoneNumber(et.getText().toString()); //执行修改数据库操作
BlackNumberDAO bnd = new BlackNumberDAO(Activityhhh1.this); bnd.update(bt); //更新集合
//BlackNumber bt = data.get(position)
//bt和data里面的对象同时指向的是同一个内存地址
//如果bt被修改了,data里面的对象也同时发生变化
//这就是引用类型的特点 //通知刷新列表
bla.notifyDataSetChanged(); Toast.makeText(Activityhhh1.this, "修改成功!", Toast.LENGTH_SHORT).show();
}
})
.show(); break; //删除
case 1: new AlertDialog.Builder(this)
.setMessage("确定要删除吗?")
.setNeutralButton("取消",null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { BlackNumberDAO bd = new BlackNumberDAO(Activityhhh1.this); //在数据库删除 需要id
bd.delete(bt.getId()); //刷新界面
//移除集合中的记录
data.remove(position);
//通知刷新
bla.notifyDataSetChanged(); Toast.makeText(Activityhhh1.this, "删除成功", Toast.LENGTH_SHORT).show(); }
})
.show(); break;
}
return super.onContextItemSelected(item);
} //列表适配器
class BlackListAdapter extends BaseAdapter
{
@Override
public int getCount() {
return data.size();
} @Override
public Object getItem(int position) {
return data.get(position);
} @Override
public long getItemId(int position) { //获取类的实例,获取id
return data.get(position).getId();
} @Override
public View getView(int position, View convertView, ViewGroup parent) { //判断可复用的视图是否为空
if (convertView ==null)
{
//获取视图
//1.获取layout文件 用加载器
convertView = View.inflate(Activityhhh1.this,android.R.layout.simple_list_item_1,null); } //给视图绑定数据
TextView tv = (TextView)convertView.findViewById(android.R.id.text1); tv.setText(data.get(position).getPhoneNumber()); return convertView;
}
}
public void bt_tianjiasjonclick(View view)
{
final EditText editText = new EditText(this);
editText.setHint("输入黑名单号码");
//editText.setLayoutParams(new ListView.LayoutParams());
editText.setInputType(InputType.TYPE_CLASS_PHONE);
//构造自定义对话框
new AlertDialog.Builder(this)
.setTitle("添加黑名单")
.setView(editText)
.setNegativeButton("取消",null)
.setPositiveButton("添加", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { //1.构造实体类 参数为输入的电话号码
BlackNumber bn = new BlackNumber(editText.getText().toString()); //2.用数据库操作类 DAO 保存数据
BlackNumberDAO blackNumberDAO = new BlackNumberDAO(Activityhhh1.this); blackNumberDAO.insert(bn); //添加数据到集合
//给add添加索引值从上往下加数据
data.add(0,bn); //通知适配器刷新ListView
bla.notifyDataSetChanged(); Toast.makeText(Activityhhh1.this, "数据保存成功", Toast.LENGTH_SHORT).show();
}
}) .setCancelable(false)
.show();
}
}
Android——黑名单管理的更多相关文章
- Android——黑名单管理(二)
说明:多加一点完善 1.在操作类 DAO 将连接数据库也放到了构造方法中(错误),加删除全部的方法 2.主界面增加了姓名一栏,用layout文件将对话框分离出来 3.删除加确认提示 4.加删除全部按钮 ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 配置android sdk 环境
1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/
- Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记
以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...
- Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记
以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- Android Studio 多个编译环境配置 多渠道打包 APK输出配置
看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...
随机推荐
- SharePoint 2013 Step by Step—— 为终端用户提供故障恢复的解决方案 Part I
Disaster Recovery,我把他直译"故障恢复",或者也可以翻译成 "灾难复原 ".光字面意思就可以领会到,当SharePoint Server发生了 ...
- SQL 给字符串补0
第一种方法: right('00000'+cast(@count as varchar),5) 其中'00000'的个数为right函数的最后参数,例如这里是5,所以有5个0 @count就是被格式化 ...
- C#基础第五天-作业-用DataTable制作名片集
1.用DataTable集合去实现名片集.(增加,修改,删除,查询,查询全部)需求:根据人名去(删除/查询).指定列:姓名,年龄,性别,爱好,电话. 本系列教程: C#基础总结之八面向对象知识点总结- ...
- eclipse 安装properties编辑器,显示中文
如图添加,地址为: propedit.sourceforge.jp/eclipse/updates/ 选择红框,只安装这个即可 然后一直安装,再接受同意,最后重启eclipse就安装好了 重启后发现文 ...
- 新书《深入应用C++11:代码优化与工程级应用》出版,感谢支持
经过一年的编写,这本书终于和大家见面了, 已经由机械工业出版社出版,希望本书能给学习C++尤其是C++11的朋友们更多的帮助. 关于C++11 在StackOverflow的最近一次世界性调查中,C+ ...
- (原创)c++11改进我们的模式之改进命令模式
模式虽然精妙,却难完美,比如观察者模式中观察者生命周期的问题:比如访问者模式中循环依赖的问题等等:其它很多模式也存在这样那样的一些不足之处,如使用场景受限.实现复杂.不够简洁.不够通用等.但我觉得不足 ...
- 每日英语:15 places to find inspiration
If you’re a writer or artist, you understand the power of location when it comes to creativity and f ...
- win7如何不用点击用户名 直接自动登录桌面
win7如何不用点击用户名 直接自动登录桌面 在win7系统中开机时必须点击相应的用户名才能登陆系统桌面那么如何取消这一功能使当前账户自动登录到系统桌面呢? 1 .在开始菜单搜索框输入 “netplw ...
- 【设计模式】适配器模式与Reader、InputStream之间的适配
简述 适配器模式,目的是将A对象通过适配.转换的方式转换成B对象来使用,为什么转换为B对象?因为用户通过依赖B对象来使用. 适配器的实现有两种方式. 继承实现 组合实现 基于Java单继承的机制,组合 ...
- ZooKeeper学习之文件系统的布局和格式
本文来谈谈快照文件,事务日志文件在文件系统中是如何存放的. 写事务日志是事务处理的关键步骤,所以高度建议在一个独立的磁盘上存储.快照不需要在独立的磁盘存储,因为它们是由一个后台线程以懒汉式的(lazi ...