在安卓开发中不可避免的会遇到在手机中保存数据的时候,如果只是小量数据(如保存设置等)的话,用SharedPreferences是个极好的选择,它以键值对的形式保存数据,但是如果数据量比较多的话,比如一个键对应了一个集合的情况,此时再用SharedPreferences保存数据就显得吃力了,如果再需要对数据进行修改删除的操作,这个保存数据的方法明显不适合了,所以安卓本身也内置了sqlite数据库,对于保存app里面的数据已经够了。
新建安卓工程后新建一个类:DatabaseDBOpenHelper.java,该类继承自SQLiteOpenHelper,主要用于新建数据库,新建数据表和更新数据库:
public class DatabaseDBOpenHelper extends SQLiteOpenHelper {
/**
* 数据库创建的构造方法 数据库名称 text.db ,版本号为1
* @param context
*/
public DatabaseDBOpenHelper(Context context) {
super(context, "text.db", null, 1);
}
/**
* 初始化数据库的表结构
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table student (id integer primary key autoincrement,name varchar(50),age integer,sex varchar(5),class varchar(50))");
}
/**
* 数据库版本升级时调用
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
改类中的构造方法用于创建数据库和初始版本号;onCreate方法用于初始化数据库的表结构,这里新建了一个student表,里面有id(主键),name,age,sex和class;
onUpgrade方法用于数据库版本升级时调用,此时可以用测试类去测试一下看看新建语法有没有问题,看看有没有新建数据库:在清单文件中application节点上方添加四行代码(第三行要写自己应用的包名)
然后在application节点中的theme下面添加一行代码:public void testCreateDatabase() {
DatabaseDao dao = new DatabaseDao(getContext());
}
右键运行该测试方法,如果在左边的工具栏中JUnit下面的条变绿就表示新建数据库成功了,此时在File Explorer 的data/data/包名 目录下就可以看到新建成功的数据库和表结构,可以导出来用SQLite Expert Personal 3工具打开,没安装该工具的可以下载,简单安装即可使用非常方便: 点击打开链接
接下来就是增加,删除,修改,查找数据了,在SQLite Expert Personal 3工具里也可以先执行sqlite指令对表数据进行操作,其实在把指令写进代码之前可以先用该工具执行需要进行的指令以验证sqlite语句是否正确。
OK,现在用Java代码实现增删改查方法:
* 向数据库中添加数据
* @param name
* @param age
* @param sex
* @param whichclass
*/
public void addStudent(String name, int age, String sex, String whichclass){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("insert into student(name,age,sex,class) values(?,?,?,?)",
new Object[]{name, age, sex, whichclass});
}
/**
* 根据name值删除数据
* @param name
*/
public void deleteStudent(String name){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("delete from student where name=?",new Object[]{name});
}
/**
* 根据name值修改表中数据
* @param name
* @param age
* @param sex
* @param whichclass
*/
public void updateStudent(String name, int age, String sex, String whichclass){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("update student set age=?, sex=?,class=? where name=?",
new Object[]{age, sex, whichclass, name});
}
/**
* 根据name值查询数据
* @param name
* @return
*/
public StudentInfo findStudent(String name){
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.rawQuery("select age,sex,class from student where name=?",
new String[]{name});
if(cursor.moveToNext()){
StudentInfo info = new StudentInfo();
info.setAge(cursor.getInt(0));
info.setSex(cursor.getString(1));
info.setWhichclass(cursor.getString(2));
return info;
}
cursor.close();
return null;
}
/**
* 查询全部数据
* @return
*/
public ArrayList findAllstudent(){
SQLiteDatabase db = helper.getWritableDatabase();
ArrayList list = new ArrayList();
Cursor cursor = db.rawQuery("select * from student",null);
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToNext();
StudentInfo info = new StudentInfo();
info.setName(cursor.getString(1));
info.setAge(cursor.getInt(2));
info.setSex(cursor.getString(3));
info.setWhichclass(cursor.getString(4));
list.add(info);
}
cursor.close();
db.close();
return list;
}
/**
* 获取记录总数
* @return
*/
public long getCounts(){
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query("student",new String[]{"count(*)"},null,null,null,null,null);
if(cursor.moveToNext()){
return cursor.getLong(0);
}
return 0;
}
其实安卓除了使用rawQuery()和execSQL()方法操作数据外还有另外一种API可以对数据进行增删改查:
* 向数据库中添加数据(另一种方法实现)
* @param name
* @param age
* @param sex
* @param whichclass
*/
public void addStudent1(String name, int age, String sex, String whichclass){
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
values.put("sex", sex);
values.put("class", whichclass);
db.insert("student", null, values);
db.close();
}
/**
* 根据name值删除数据(另一种实现方法)
* @param name
*/
public void deleteStudent1(String name){
SQLiteDatabase db = helper.getWritableDatabase();
db.delete("student", "name=?", new String[]{name});
}
/**
* 根据name值修改表中数据(另一种方法实现)
* @param name
* @param age
* @param sex
* @param whichclass
*/
public void updateStudent1(String name, int age, String sex, String whichclass){
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("age", age);
values.put("sex", sex);
values.put("class", whichclass);
db.update("student", values, "name=?", new String[]{name});
}
/**
* 根据name值查询数据(另一种查询方法)
* @param name
* @return
*/
public StudentInfo findStudent1(String name){
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query("student", new String[]{"name","age","sex","class"},
"name=?", new String[]{name},null, null, null);
if(cursor.moveToNext()){
StudentInfo info = new StudentInfo();
info.setName(cursor.getString(0));
info.setAge(cursor.getInt(1));
info.setSex(cursor.getString(2));
info.setWhichclass(cursor.getString(3));
return info;
}
cursor.close();
return null;
}
剩下的就是在测试类中写测试代码来测试每个方法了,我已经将这些例子写成demo了,有兴趣的朋友可以下载看看共同学习进步,demo下载: 点击打开下载demo
下一篇将会分享分页查询(有demo)和事物。