上一次课已经讲过了如何使用我们手中现有的数据库模板,那么如今我们就来定制个性化的数据库模板,首先需要对SQLiteClientDaoHelper这个类做个了解,如此我们才可以为所欲为改动。
package com.example.dao;
import java.util.List;
import com.example.bean.User;
import com.example.core.SQLiteClientDaoHelper;
import com.example.core.SQLiteClientDaoHelper.BuildData;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
public class UserDao {
//由于需要对数据库进行管理我们将SQLiteClientDaoHelper对象定义好
private SQLiteClientDaoHelper helper;
public UserDao(Context context) {
helper = SQLiteClientDaoHelper.getInstance(context);
}
/*
* 之所以定义list接受user是因为组织id是有一样的,有很多用户属于同一个组织,这时候只返回User类显然不合适,所以
* 采用List接受多个User类。
*/
public List<User> getUsers(long orgId) {
return helper.getAll("SELECT userId, userName, phoneNumber1, phoneNumber2, shortNumber1, shortNumber2, orgId FROM user WHERE orgId = ? ORDER BY shortNumber1",
new String[] { String.valueOf(orgId) }, new BuildData<User>() {
@Override
//通过orgid这里定义的是组织id,来找到cursor大家可以把它看成游标,定义到此id的user那一行
public User onBuildData(Cursor cursor) {
User user = new User();
/*
* 定义到那一行以后,根据我们写好的数据库知道第一个是Id,第二个是名字,类似这样获取,返回。
*/
user.setUserId(cursor.getString(0));
user.setUserName(cursor.getString(1));
user.setPhoneNumber1(cursor.getString(2));
user.setPhoneNumber2(cursor.getString(3));
user.setShortNumber1(cursor.getString(4));
user.setShortNumber2(cursor.getString(5));
user.setOrgId(cursor.getInt(6));
return user;
}
});
}
/*
* 更新数据库表格,根据我们定义的元素使用ContentValues values = new ContentValues();进行元素更新。
*/
public void updateUser(User user){
ContentValues values = new ContentValues();
values.put("userId", user.getUserId());
values.put("userName", user.getUserName());
values.put("phoneNumber1", user.getPhoneNumber1());
values.put("phoneNumber2", user.getPhoneNumber2());
values.put("shortNumber1", user.getShortNumber1());
values.put("shortNumber2", user.getShortNumber2());
values.put("orgId", user.getOrgId());
if(isExistsUser(user.getUserId())) {
helper.update("user", values, "userId=?", new String[] { user.getUserId() });
} else {
helper.insert("user", values);
}
}
public void deleteUser(String userid){
helper.delete("user", "userId = ?", new String[] { userid });
}
public boolean isExistsUser(String stationId) {
Boolean result = helper.get("SELECT count(1) as counts FROM user WHERE userId = ?",
new String[] { stationId }, new BuildData<Boolean>() {
@Override
public Boolean onBuildData(Cursor cursor) {
return cursor.getInt(0) > 0;
}
});
return result != null && result;
}
}
改装的主要过程是在这里
改装按照模板来,基本上我们只需要变几个参数就可以了
比如:
public List<User> getUsers(long orgId)
这里面我们可以看到方法是得到所有的用户类,但是有的时候我们只需要得到一个用户,利用电话号码作为标识这时候怎么改?很简单,看看原来类似方法开始改
复制粘贴这方法整体。
然后查找SQLiteClientDaoHelper定义的获取为个体用户的方法
原先的方法是getAll,显然不适合。
public <E> E get(String table, String[] columns, String selection,
String[] selectionArgs, String orderBy, BuildData<E> buildData) {
return get(table, columns, selection, selectionArgs, null, null, orderBy, buildData);
}
找到了这里获取到范类,也就是任何类都适用,显然对于我们User用户类也是适用的。
于是我们改好的方法如下:
public User getUser(String phone) {
return helper.get("SELECT userId, userName, phoneNumber1, phoneNumber2, "
+ "shortNumber1, shortNumber2, orgId FROM user WHERE phoneNumber1 = ? ",
new String[] {phone}, new BuildData<User>() {
@Override
//通过orgid这里定义的是组织id,来找到cursor大家可以把它看成游标,定义到此id的user那一行
public User onBuildData(Cursor cursor) {
User user = new User();
/*
* 定义到那一行以后,根据我们写好的数据库知道第一个是Id,第二个是名字,类似这样获取,返回。
*/
user.setUserId(cursor.getString(0));
user.setUserName(cursor.getString(1));
user.setPhoneNumber1(cursor.getString(2));
user.setPhoneNumber2(cursor.getString(3));
user.setShortNumber1(cursor.getString(4));
user.setShortNumber2(cursor.getString(5));
user.setOrgId(cursor.getInt(6));
return user;
}
});
}
其中改动的关键点:
现在让我们看一下是否works:
编写代码测试是否能查找到电话号码为888888的用户:
userdao=new UserDao(this);
User user=userdao.getUser("888888");
datashow.append(user.getUserName()+"电话号码:"+user.getPhoneNumber1()+"\n");
OK搞定,说明我们模板是成功的。接下来继续改
【根据电话号码删除用户】:
其实例子做多了无论是按照电话号码还是人名还是性别还是年龄,都可以做出针对其变量的删除方法。
万变不离其宗,只要模板在手
找到删除模板:
public void deleteUser(String userid){
helper.delete("user", "userId = ?", new String[] { userid });
}
现在修改
简单:将userid替换成电话号码即可:注意除了形参,sql语句里面的参数严格按照数据库定义的修改,否则失败
public void deleteUser2(String phonenumber){
helper.delete("user", "phoneNumber1 = ?", new String[] { phonenumber });
}
测试:
可以看到电话号码为888888已经被删除掉了。
对于修改数据库适应自己的app就到此结束,很多都可以自己试一下,不过基本的都在这里了。
整个工程包会在这里上传供大家使用。
下面的DataBaseTest 压缩包就是