对SQLite和ListView的单独介绍在其他两篇博客中,欢迎移步:
学Android—SQLite
学Android—ListView
首先展示结果:
为了方便,只做了一个界面,因为首先想到的是完成功能,后续会对界面进行完善。
代码已上传到github,第一次做这些东西,还有很多需要修改的地方,请多指教~
https://github.com/jiangxingling/TelephoneBook
数据库部分实现
1、实现SQLiteOpenHelper类
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* extends SQLiteOpenHelper,override onCreate() and onUpgrade() method
*/
public class DBHelper extends SQLiteOpenHelper{
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* create table here,an item includes name and phonenumber
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
String create_table = "create table if not exists person"
+"(name text primary key,"
+"phoneNumber text not null)";
db.execSQL(create_table);
Log.d("DBHelper","23 onCreate create_table");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2、在MainActivity.java中完成数据库的创建
createDatabase();
/**
* create a database named "people"
*/
private void createDatabase() {
DBHelper dbHelper = new DBHelper(mContext,"people.db",null, 1);
db = dbHelper.getWritableDatabase();
Log.d("MainActivity","createDatabase() -- createDatabase succeed!");
}
3、为ListView读取数据,查询数据库中的所有数据并存放到一个HashSet中
/**
* do query in database and put the values in a HashSet--person_set
*/
private void queryData() {
person_set = new HashSet<>();
SQLiteDatabase db = openOrCreateDatabase("people.db",MODE_PRIVATE,null);
Cursor cursor = db.rawQuery("select * from person",null);
if(cursor != null){
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone_number = cursor.getString(cursor.getColumnIndex("phoneNumber"));
Log.d("MainActivity","queryData() -- name = "+ name+", phone_number= " + phone_number);
person_set.add(new Person(name,phone_number));
}
}
}
4、创建Person类,因为HashSet中存放的是Person对象,一个Person对象包括name和phonenumber两种属性
import android.util.Log;
/**
* person should have a name and a phone number
*/
public class Person {
private String name;
private String phoneNumber;
public Person(String name, String phoneNumber) {
this.phoneNumber = phoneNumber;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
ListView部分实现
1、取出从数据库中读出的数据
getData()
private List<Map<String, Object>> getData(){
if(person_set != null) {
for(Person p:person_set){
Map<String,Object> map = new HashMap<>();
map.put("name",p.getName());
map.put("phone",p.getPhoneNumber());
Log.d("MainActivity","getData() -- name = " + p.getName()+", phone = "+p.getPhoneNumber());
datalist.add(map);
}
// Iterator<Person> it = person_set.iterator();
// while (it.hasNext()) {
// Map<String, Object> map = new HashMap<>();
// Person p = it.next();
// map.put("name", p.getName());
// map.put("phone", p.getPhoneNumber());
// Log.d("MainActivity", "getData() name = " + p.getName() + ", phone = " + p.getPhoneNumber());
// datalist.add(map);
// }
}
return datalist;
}
2、添加ListView到界面中
initListView()
private void initListView(){
contacts = (ListView) findViewById(R.id.contacts);
datalist = new ArrayList<>();
list_adapter = new SimpleAdapter(mContext, getData(), R.layout.items,new String[]{"name", "phone"}, new int[]{R.id.name, R.id.phone});
contacts.setAdapter(list_adapter);
}
添加数据及ListView刷新
设置EditText及添加数据的Button,为Button设置响应事件,点击时将数据添加到数据库并刷新ListView的数据显示
private void initView() {
addName = (EditText) findViewById(R.id.add_name);
addPhone = (EditText) findViewById(R.id.add_phone);
add = (Button) findViewById(R.id.add);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String add_name = addName.getText().toString();
String add_phone = addPhone.getText().toString();
if(!add_name.isEmpty() && !add_phone.isEmpty()) {
ContentValues values = new ContentValues();
values.put("name", add_name);
values.put("phoneNumber", add_phone);
db.insert("person", null, values);
values.clear();
Toast.makeText(mContext, "Add Succeed!", Toast.LENGTH_SHORT).show();
addName.setText("");
addPhone.setText("");
queryData();
initListView();
}else {
Toast.makeText(mContext, "Name or Phone Number can not null", Toast.LENGTH_SHORT).show();
}
}
});
initListView();
}
以上,一个最最最简单的电话本就这样完成了,不过从严格意义上来说,这还不是一个真正的电话本,因为对号码的格式没有要求,同时也不支持删除功能,除此之外还有很多功能没有实现,不过对SQLite最基本的操作和ListView的应用要求还是达到了,后续再进行改进吧!
查看源码请到github网站:
https://github.com/jiangxingling/TelephoneBook