现在有点焦虑,不想写代码了,故而写一下博文来放松一下。
刚刚学了android中SQLite的使用,其实倒也不难,但是与JDBC操作数据库相比,这个还是有点不顺手,而且我好久没写底层的封装了,使用SSM框架这些都不需要考虑......好了,废话不多说,下面直接建立一个测试工程来试试SQLite在Android中的应用吧。
1、新建一个工程
2、配置junit测试环境
打开AndroidManifest.xml文件,进行jUnit相关配置,具体如下图:
3、源码
关于在Android中如何使用SQLite的文章很多,我也是参考那些文章进行学习的。作为一个J2EE方向的开发者,我习惯于面向对象进行编程,而老罗的视频以及一些其他的教程关于CRUD操作使用的都是字符串,这我有点不适应,所有我在学习的过程中就改成了面向对象的CRUD操作,这样用着也方便点。原理、API什么的我就不说了,百度一下嗖嗖的都出来了,下面直接贴代码(完整工程下载,点这里):
这样一个继承SQLiteOpenHelper的类主要就这么几个功能:
a.创建数据库和表
b.如果数据库有不同版本那么就会更新数据库
c.调用的这个类的对象来取得数据库的读写权限
package com.example.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "test.db"; private static final int DATABASE_VERSION = 1; public DBHelper(Context context) { // CursorFactory设置为null,使用默认值 super(context, DATABASE_NAME, null, DATABASE_VERSION); } // 数据库第一次被创建时onCreate会被调用 @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE IF NOT EXISTS person " + "(id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(32),sex VARCHAR(8))"; db.execSQL(sql); } // 如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("ALTER TABLE base_info ADD COLUMN other STRING"); } }
可以看到上面创建了一个叫test.db的数据库,其中有一个表person,表中有三个字段:主键-id,姓名-name,性别-sex。
下面生成这个表对应的实体类:
package com.example.pojo; public class Person { private int id; private String name; private String sex; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", sex=" + sex + "]"; } }
我们要实现CRUD操作,那么建一个接口定义CRUD方法:
package com.example.dao; import com.example.pojo.Person; public interface IPersonDao { public boolean insert(Person person); public boolean delete(int id); public boolean update(Person person); public Person select(int id); }
下面要实现IPersonDao接口,定义具体的业务方法:
package com.example.dao.impl; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.example.dao.IPersonDao; import com.example.db.DBHelper; import com.example.pojo.Person; public class PersonDaoImpl implements IPersonDao { DBHelper helper = null; public PersonDaoImpl(Context context){ helper = new DBHelper(context); } @Override public boolean insert(Person person) { boolean flag = false; SQLiteDatabase database = null; try { String sql = "INSERT INTO person(name,sex) VALUES (?,?)"; database = helper.getWritableDatabase(); database.execSQL(sql, new Object[]{person.getName(),person.getSex()}); flag = true; } catch (Exception e) { e.printStackTrace(); }finally{ if(database!=null){ database.close(); } } return flag; } @Override public boolean delete(int id) { boolean flag = false; SQLiteDatabase database = null; try { String sql = "DELETE FROM person WHERE id=?"; database = helper.getWritableDatabase(); database.execSQL(sql, new Object[]{Integer.toString(id)}); flag = true; } catch (Exception e) { e.printStackTrace(); }finally{ if(database!=null){ database.close(); } } return flag; } @Override public boolean update(Person person) { boolean flag = false; SQLiteDatabase database = null; try { String sql = "UPDATE person set name=? , sex=? where id=?"; database = helper.getWritableDatabase(); database.execSQL(sql, new Object[]{person.getName(),person.getSex(),person.getId()}); flag = true; } catch (Exception e) { e.printStackTrace(); }finally{ if(database!=null){ database.close(); } } return flag; } @Override public Person select(int id) { Person person = new Person(); SQLiteDatabase database = null; try { String sql = "SELECT * FROM person where id=?"; database = helper.getReadableDatabase(); Cursor cursor = database.rawQuery(sql, new String[]{Integer.toString(id)}); while(cursor.moveToNext()){ int _id = cursor.getInt(cursor.getColumnIndex("id")); String _name = cursor.getString(cursor.getColumnIndex("name")); String _sex = cursor.getString(cursor.getColumnIndex("sex")); person.setId(_id); person.setName(_name); person.setSex(_sex); } } catch (Exception e) { e.printStackTrace(); }finally{ if(database!=null){ database.close(); } } return person; } }
以上完成之后就可以开始单元测试了,绿色......
package com.example.test; import com.example.dao.IPersonDao; import com.example.dao.impl.PersonDaoImpl; import com.example.pojo.Person; import android.test.AndroidTestCase; import android.util.Log; public class Test extends AndroidTestCase { public void insertDB(){ IPersonDao personDao = new PersonDaoImpl(getContext()); Person person = new Person(); person.setName("李四"); person.setSex("男"); personDao.insert(person); } public void selectDB(){ IPersonDao personDao = new PersonDaoImpl(getContext()); Person person = personDao.select(1); Log.i("info", person.toString()); } public void updateDB(){ IPersonDao personDao = new PersonDaoImpl(getContext()); Person person = personDao.select(1); person.setName("改名字啦"); person.setSex("不详"); personDao.update(person); } public void deleteDB(){ IPersonDao personDao = new PersonDaoImpl(getContext()); personDao.delete(2); } }
导出test.db文件,在SQLite Expert中打开:
这是insert测试成功的例子,其他就不放图了,这个软件百度就可以下载了。
(转载注明出处:http://blog.csdn.net/zhshulin)