> 已经实现了sqlite的数据库的增删改查,今天参照*androidstudio实现联系人功能 第一版 2018年07月16日 21:11:06
中还没有实现的两个功能做了改进。下面我将会直接放上代码,
图片请大家参照我的博客第一版里面的,
,图片请大家参照我的博客第一版里面的
,图片请大家参照我的博客第一版里面的
虽然做了一些改进,但具体原理是一样的2018年07月16日 21:11:06 jscsd226。
**>layout有三个 Java文件两个,数据库一个。大家复制代码的时候不要单纯的复制,要把握其中的共同点,吸收,才能慢慢提高。
- activity_main
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#F0E6FD"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="25dp"
android:layout_y="84dp"
android:text="请输入姓名:"
android:textColor="#00E5BE" />
<EditText
android:id="@+id/search_et"
android:layout_width="109dp"
android:layout_height="wrap_content"
android:layout_x="134dp"
android:layout_y="65dp"
android:hint="姓名"
android:textColor="#00E5BE"
android:textSize="18sp" />
<Button
android:id="@+id/search_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="144dp"
android:layout_y="137dp"
android:background="#F0E6FD"
android:text="查询所有联系人"
android:textColor="#00E5BE" />
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="274dp"
android:layout_y="141dp"
android:background="#F0E6FD"
android:text="添加联系人"
android:textColor="#00E5BE" />
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="296dp"
android:layout_alignParentTop="true"
android:layout_x="0dp"
android:layout_y="213dp"
tools:layout_editor_absoluteX="219dp"
tools:layout_editor_absoluteY="455dp" />
<Button
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="22dp"
android:layout_y="137dp"
android:background="#F0E6FD"
android:text="删除联系人"
android:textColor="#00E5BE"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/search_btn_bit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="272dp"
android:layout_y="71dp"
android:background="#F0E6FD"
android:text="查询联系人"
android:textColor="#00E5BE"
tools:layout_editor_absoluteX="241dp"
tools:layout_editor_absoluteY="66dp" />
</AbsoluteLayout>
2
.activity_add
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#F0E6FD"
xmlns:android="http://schemas.android.com/apk/res/android">
<EditText
android:id="@+id/add_word"
android:layout_width="181dp"
android:layout_height="wrap_content"
android:layout_x="144dp"
android:layout_y="40dp"
android:hint="姓名"
android:textSize="18sp" />
<EditText
android:id="@+id/add_interpret"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_x="146dp"
android:layout_y="94dp"
android:hint="联系方式"
android:inputType="number"
android:maxLength="11"
android:textSize="18sp" />
<TextView
android:id="@+id/widget39"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="55dp"
android:layout_y="54dp"
android:text="请输入姓名:" />
<TextView
android:id="@+id/widget40"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="56dp"
android:layout_y="106dp"
android:text="请输入电话:" />
<Button
android:id="@+id/save_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="88dp"
android:layout_y="160dp"
android:text="保存" />
<Button
android:id="@+id/cancel_btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="213dp"
android:layout_y="159dp"
android:text="返回" />
</AbsoluteLayout>
3.result_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/result_word"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/result_interpret"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
4.mainActivity
package jscsd.sqlitedatabasetwo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.widget.AdapterView;
import android.widget.Button;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends Activity {
private MyDatabaseHelper dbOpenHelper;//定义DBOpenHelper
private SQLiteDatabase dbRead,dbWrite;
private SimpleCursorAdapter adapter;
/*
创建AlertDialog的步骤:
1、创建AlertDialog.Builder对象
2、调用Builder对象的setTitle方法设置标题,setIcon方法设置图标
3、调用Builder相关方法如setMessage方法、setItems方法、setSingleChoiceItems方法、setMultiChoiceItems方法、setAdapter方法、setView方法设置不同类型的对话框内容。
4、调用setPositiveButton、setNegativeButton、setNeutralButton设置多个按钮
5、调用Builder对象的create()方法创建AlertDialog对象
6、调用AlertDialog对象的show()方法将对话框显示出来
*/
private AdapterView.OnItemLongClickListener listViewItemLongClickListener=new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
final int position, long id) {
new AlertDialog.Builder(MainActivity.this).setTitle("提醒").setMessage("您确定要删除该项吗").setNegativeButton("取消", null).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Cursor c = adapter.getCursor();
c.moveToPosition(position);
int itemId = c.getInt(c.getColumnIndex("_id"));
dbWrite.delete("dict", "_id=?", new String[]{itemId+""});
refreshListView();
}
}).show();
return true; //如果是true操作系统执行的反馈(震动或者声音) 如果是false 则不触发
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbOpenHelper = new MyDatabaseHelper(this);
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
final ListView listView = (ListView) findViewById(R.id.list);
final EditText etSearch = (EditText) findViewById(R.id.search_et);
Button btnSearch = (Button) findViewById(R.id.search_btn);
Button btnSearch_bit = (Button) findViewById(R.id.search_btn_bit);
Button btn_add = (Button) findViewById(R.id.btn_add);
Button btn_delete = (Button) findViewById(R.id.btn_delete);
//触发方法的实现 长按触发删除某一行
dbRead = dbOpenHelper.getReadableDatabase();
dbWrite = dbOpenHelper.getWritableDatabase();
adapter = new SimpleCursorAdapter(this, R.layout.result_main, null, new String[]{"word", "detail"}, new int[]{R.id.result_word, R.id.result_interpret});
refreshListView();
listView.setOnItemLongClickListener(listViewItemLongClickListener);
//删除的实现
//方法:
// 1.假如要删除所有的,把条件和后面的置为空。
// 2.假如要删除指定的某一个,即加入占位符,后面的把要删除的某一行写上。
// 3.假如要删除其中的某个咋们输入的自己的数,则先用getTest().toString()方法获取到输入的数据,然后在后面调用,即可。
btn_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//获得数据库的写操作,并声明db,以便用于手续的sql语句操作
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//定义key,获得输入框输入的数据,便于后续的删除操作
String key = etSearch.getText().toString();
//此处一定注意
// 我们在判断是否相等时,数字方面的用==,而字符与字符串必须要用equals方法
if (key.equals("")) {
Toast.makeText(MainActivity.this, "没有可删除的数据", Toast.LENGTH_LONG).show();
} else {
//db.delete("dict","nulll",null); 这句话是删除表中的所有的数据
db.delete("dict", "word=?", new String[]{key}); //删除之前定义的key
Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_LONG).show();
}
}
});
//跳转界面用 Intent实现,这是通用的一种方式。
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AddActivity.class);
//通过Intent跳转添加生词界面
startActivity(intent);
}
});
//查询其中的某一个,
btnSearch_bit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String key = etSearch.getText().toString();//获取要查询的姓名
//query("user",new String[]{"id","name"},"id=?",new String[]{"1"},null,null,null)
Cursor cursor = dbOpenHelper.getReadableDatabase().query("dict", null, "word=?", new String[]{key}, null, null, null);
//创建ArrayList对象,用于保存查询输出的结果
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();// 创建一个结果集 两个String类型
while (cursor.moveToNext()) {
//用while循环一直判断,当下一条为假时,我们的游标循环也就结束了
//cursor.movetonext 定义一个游标 它的作用是将游标向下挪动一位 判断当前游标位置的下一条还有没有数据 如果有 就返回真 如果无 就返回假
Map<String, String> map = new HashMap<>(); //新开辟一个map的集合空间
// map.put("id",cursor.getString(0));
map.put("word", cursor.getString(1));//在第一行输出姓名
map.put("interpret", cursor.getString(2));//在第二行输出电话
resultList.add(map);//在XML文件resultList 显示
}
if (resultList == null || resultList.size() == 0) {
Toast.makeText(MainActivity.this, "查无此人", Toast.LENGTH_LONG).show();
} else {
//定义一个simpleAdapter,供列表项使用
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word, R.id.result_interpret});
listView.setAdapter(simpleAdapter);
}
}
});
//查询所有的
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// String key = etSearch.getText().toString();//获取要查询的姓名
//query("user",new String[]{"id","name"},"id=?",new String[]{"1"},null,null,null)
Cursor cursor = dbOpenHelper.getReadableDatabase().query("dict", null, null, null, null, null, null);
//创建ArrayList对象,用于保存查询输出的结果
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();// 创建一个结果集 两个String类型
while (cursor.moveToNext()) {
//用while循环一直判断,当下一条为假时,我们的游标循环也就结束了
//cursor.movetonext 定义一个游标 它的作用是将游标向下挪动一位 判断当前游标位置的下一条还有没有数据 如果有 就返回真 如果无 就返回假
Map<String, String> map = new HashMap<>(); //新开辟一个map的集合空间
map.put("word", cursor.getString(1));//在第一行输出姓名
map.put("interpret", cursor.getString(2));//在第二行输出电话
resultList.add(map);//在XML文件resultList 显示
}
if (resultList == null || resultList.size() == 0) {
Toast.makeText(MainActivity.this, "没有相关记录", Toast.LENGTH_LONG).show();
} else {
//定义一个simpleAdapter,供列表项使用
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word, R.id.result_interpret});
listView.setAdapter(simpleAdapter);
}
}
});
}
private void refreshListView(){
Cursor c = dbRead.query("dict", null, null, null, null, null, null);
adapter.changeCursor(c);
}
//释放数据库连接
@Override
protected void onDestroy(){
super.onDestroy();
if(dbOpenHelper!=null){
dbOpenHelper.close();
}
}
//双击退出 使用按下的方式。双击退出一共有三种方式 按下 弹起 定时
//记录用户首次点击返回键的时间
private long firstTime=0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_DOWN){
if (System.currentTimeMillis()-firstTime>2000){
Toast.makeText(MainActivity.this,"再按一次退出程序--->onKeyDown",Toast.LENGTH_SHORT).show();
firstTime=System.currentTimeMillis();
}else{
finish();
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
5.addActivity
package jscsd.sqlitedatabasetwo;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class AddActivity extends AppCompatActivity {
private MyDatabaseHelper dbOpenHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
dbOpenHelper = new MyDatabaseHelper(this);
final EditText etWord =(EditText) findViewById(R.id.add_word);
final EditText etExplain =(EditText) findViewById(R.id.add_interpret);
Button btn_Save =(Button)findViewById(R.id.save_btn);
Button btn_Cancel =(Button)findViewById(R.id.cancel_btn1);
btn_Save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String word =etWord.getText().toString();
String explain =etExplain.getText().toString();
if (word.equals("")||explain.equals("")){
Toast.makeText(AddActivity.this,"填写的联系人或者电话为空",Toast.LENGTH_SHORT).show();
}
else {
//调用insertData方法,实现插入数据
insertData(dbOpenHelper.getReadableDatabase(),word,explain);
//显示提示信息
Toast.makeText(AddActivity.this,"添加联系人成功!",Toast.LENGTH_LONG).show();
}
}
});
btn_Cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(AddActivity.this,MainActivity.class);
startActivity(intent);
finish();
}
});
}
private void insertData(SQLiteDatabase readableDatabase,String word,String explain){
//生词ContentValues对象
ContentValues values =new ContentValues();
//向该对象当中插入键值对,其中键是列名,值是希望插入这一列的值,值必须和数据库的数据类型匹配
values.put("word",word);//保存联系人
values.put("detail",explain);//保存电话
readableDatabase.insert("dict",null,values);//执行插入操作
}
//更新操作
//第一个参数是要更新的表名 第二个是一个ContentValeus对象 第三个是where字句
//dbOpenHelper.update("dict",values,"id=?",new String[]{"?"});
}
6.myDatabaseHelper.java
package jscsd.sqlitedatabasetwo;
/*
MyDatabaseHelper作为一个访问sqlite的助手类,提供两个方面的功能
1.getReadableDatabase(),getWriteableDatabase(), 可以获得sqliteDatabase对象。
2.提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作。
*/
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDatabaseHelper extends SQLiteOpenHelper {
//这里面有三个参数
/*
第一个是id 主键,它是自动增长的
第二个与第三个是我们定义的两个数据 姓名 电话
*/
final String CREATE_TABLE_SQL = "create table dict(_id integer primary key autoincrement,word varchar(5),detail varchar(11))";
//在SQLiteOpenHelper的子类当中,必须有该构造函数。
public MyDatabaseHelper(Context context){
//必须通过super调用父类中的构造函数
super(context,"dict.db",null,1);//重写构造方法并设置工厂为null
}
@Override
//该函数在第一次创建数据库时执行
public void onCreate(SQLiteDatabase db){
//execSQL用于执行SQL语句
/*
怎么预置数据呢
我们现在有两种方式,
1.用studiosqlite新建数据库,然后把表导入到我们的手机上 暂时还没有实现
2.在代码里面直接写入 如下
*/
db.execSQL(CREATE_TABLE_SQL);//创建单词信息表
db.execSQL("insert into dict(word,detail) values(?,?)",new String[]{"张SIT","10000000"});
db.execSQL("insert into dict(word,detail) values(?,?)",new String[]{"田","10000005"});
}
@Override
//重写基类的onUpgrade()方法,以便数据库版本更新
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
//提示版本更新并输出旧版本与新版本信息
System.out.println("---版本更新---"+oldVersion+"--->"+newVersion);
}
}
到这儿所有的代码就结束了,至于配置文件里面没啥需要改的,我们的studio会自动生成。
如果大家有啥问题,欢迎加群讨论(加群832021435)